4483: 可持久化入门之数对

题目描述

题目描述

如题,你需要维护这样的一个数对(即两个数),支持如下几种操作

  1. 在某个历史版本上修改某一个位置上的值
  2. 访问某个历史版本上的某一位置的值

此外,每进行一次操作(对于操作2,即为生成一个完全一样的版本,不作任何改动),就会生成一个新的版本。版本编号即为当前操作的编号(从1开始编号,版本0表示数对的初始状态)

输入格式

输入的第一行包含一个正整数 MM, 表示操作的个数。

第二行包含两个整数,即数对的初始状态,依次为第一个数 xx 和第二个数 yy。

接下来 MM 行,第 ii 行包含 4 或 3 个整数,代表两种操作之一:

  1. 对于操作1,格式为 vi 1 loci valueivi​ 1 loci​ valuei​,即在版本 vivi​的基础上,复制一份生成一个新的版本,并将第 lociloci​ 个数(lociloci​ 为 11 或 22),修改为 valueivaluei​。
  2. 对于操作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
  • lociloci​ 为 11 或 22
  • 1≤x,y,valuei≤1001≤x,y,valuei​≤100

子任务划分:

  • 子任务 1(30 分):只有操作 2
  • 子任务 2(30 分):保证 loci=1loci​=1
  • 子任务 3(40 分):没有特殊限制
    #include
    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

你可能感兴趣的:(竞赛,算法,c++,竞赛)