Skip to content

14041: 【原4041】STL系列-vector

题目

题目描述

author: Engineev 原OJ链接:https://acm.sjtu.edu.cn/OnlineJudge-old/problem/4041

Description

面包是一个友善的助教,为了同学们和助教们的身心健康,所以出了这一套C++ STL使用系列,旨在帮助 大家熟悉STL的一些操作。

设你有\(n\)行(0-based)数字,对这堆数字会进行\(m\)次操作,分别如下 1. 在第\(i\)行的最后添加一个数\(x\),为本次输入的数和最近一次操作三输出的数的异或结果, 如果还没有进行过操作3,就不用异或了OvO。 2. 删除第\(i\)行的最后一个数。 3. 询问第\(i\)行第\(j\)列的数的数值。

对于所有的操作,保证都是合法的。

Input Format

第一行为\(n\)和\(m\), 接下来的\(m\)行为操作,每个操作格式如下, 第一个数\(t\)表示操作编号,对于各个操作之后是

  1. 第\(i\)行和数\(y\)
  2. 第\(i\)行
  3. 第\(i\)行第\(j\)列

Output Format

对于每一个操作3,输出对应的答案。

Sample Input

3 10
1 1 1622650073
3 1 0
1 2 1458777923
2 2
1 2 114807987
3 1 0
2 1
1 1 1264817709
3 1 0
1 0 893351816

Sample Output

1622650073
1622650073
735329012

数据范围

对于100%的数据,N <= 10000,M <= 100000,x是在int范围内正整数

FineArtz's solution

/* STL-vector */
#include <iostream>
#include <cstdio>
#include <vector>
#include <stack>
using namespace std;

int main(){
    int n, m;
    scanf("%d%d", &n, &m);
    //cin >> n >> m;
    vector<vector<int>> v;
    int last3 = -1;
    v.resize(n);
    while (m--){
        int t, i, x;
        scanf("%d", &t);
        switch(t){
            case 1:
                scanf("%d%d", &i, &x);
                //cin >> i >> x;
                if (last3 == -1) v[i].push_back(x);
                else v[i].push_back(x ^ last3);
                break;
            case 2:
                scanf("%d", &i);
                //cin >> i;
                v[i].erase(v[i].end() - 1);
                break;
            case 3:
                scanf("%d%d", &i, &x);
                //cin >> i >> x;
                last3 = v[i][x];
                printf("%d\n", v[i][x]);
                //cout << v[i][x] << endl;
                break;
            default:
                break;
        }
    }
    return 0;
}