题目描述
题目描述
如题,你需要维护这样的一个数对(即两个数),支持如下几种操作
- 在某个历史版本上修改某一个位置上的值
- 访问某个历史版本上的某一位置的值
此外,每进行一次操作(对于操作2,即为生成一个完全一样的版本,不作任何改动),就会生成一个新的版本。版本编号即为当前操作的编号(从1开始编号,版本0表示数对的初始状态)
输入格式
输入的第一行包含一个正整数 MM, 表示操作的个数。
第二行包含两个整数,即数对的初始状态,依次为第一个数 xx 和第二个数 yy。
接下来 MM 行,第 ii 行包含 4 或 3 个整数,代表两种操作之一:
- 对于操作1,格式为 vi 1 loci valueivi 1 loci valuei,即在版本 vivi的基础上,复制一份生成一个新的版本,并将第 lociloci 个数(lociloci 为 11 或 22),修改为 valueivaluei。
- 对于操作2,格式为 vi 2 locivi 2 loci,即在版本 vivi的基础上,复制一份生成一个新的版本,并输出第 lociloci 个数(lociloci 为 11 或 22)。
输出格式
输出包含若干行,依次为每个操作2的结果。
输入1:
6
30 40
0 1 2 50
0 1 1 60
1 2 1
1 2 2
2 2 2
5 2 1
输出1:
30
50
40
60
样例解释
- 版本 00:初始版本,数对为
30, 40
- 版本 11:
0 1 2 50
,基于版本 00 复制一份,并把第二个数改为 50,得到的数对为30, 50
- 版本 22:
0 1 1 60
,基于版本 00 复制一份,并把第一个数改为 60,得到的数对为60, 40
- 版本 33:
1 2 1
,基于版本 11 复制一份,得到的数对为30, 50
,并输出第一个数30
- 版本 44:
1 2 2
,基于版本 11 复制一份,得到的数对为30, 50
,并输出第二个数50
- 版本 55:
2 2 2
,基于版本 22 复制一份,得到的数对为60, 40
,并输出第二个数40
- 版本 66:
5 2 1
,基于版本 55 复制一份,得到的数对为60, 40
,并输出第一个数60
数据范围
对于 100%100% 的数据,保证:
- 1≤M≤1001≤M≤100
- vi<ivi<i
- lociloci 为 11 或 22
- 1≤x,y,valuei≤1001≤x,y,valuei≤100
子任务划分:
- 子任务 1(30 分):只有操作 2
- 子任务 2(30 分):保证 loci=1loci=1
- 子任务 3(40 分):没有特殊限制
#include<bits/stdc++.h> using namespace std; struct c{ int shu1,shu2; }; int array_x[110]; c cc[110]; int main(){ int a,b,d,q,p,cnt1=1;; cin>>a>>cc[0].shu1>>cc[0].shu2; for(int i=1;i<=a;i++){ cin>>b>>d>>q; if(d==1){ cin>>p; cc[i].shu1=cc[b].shu1; cc[i].shu2=cc[b].shu2; if(q==1){ cc[i].shu1=p; }else{ cc[i].shu2=p; } }else{ cc[i].shu1=cc[b].shu1; cc[i].shu2=cc[b].shu2; if(q==1){ array_x[cnt1]=cc[i].shu1; }else{ array_x[cnt1]=cc[i].shu2; } cnt1++; } } for(int i=1;i<cnt1;i++){ cout<<array_x[i]<<endl; } return 0; }