题目描述 小w最近在学习可持久化数据结构,不过小w越学越困,然后他...他就睡着了。在梦境的世界中,他发现有一种可持久化的变量。只要用这种变量写出来的数据结构,都能变成可持久化数据结构。比如用这种变量开一个数组,这个数组就是一个可持久化数组,用这种变量写一颗线段树,线段树也变成可持久化线段树了。小w梦醒以后十分生气,因为现实中并不存在这么一种能够可持久化的变量。现在他把这个任务交给了你。
现在让你维护一个变量,变量的初始值为0并且该变量的值将不会超过int类型的范围,该变量支持以下四种操作:
ADD(x)操作,该变量的值增加x。
SUB(x)操作,该变量的值减少x。
SET(x)操作,设定该变量的值为x。
BACK(x)操作,回溯之前的x个操作,也就是x一定小于等于之前输入的操作总数(1≤≤x≤≤已经输入的 操作总数)。
例如BACK(1)表示回溯到上次操作前的状态,BACK(3)表示以当前操作为基准回溯到前3次操作前的状态,注意BACK操作本身也算作操作。
你需要在每一个操作之后,输出这个变量现在的值,输出的整数之间用空格隔开,行末不允许有多余空格。
输入描述: 第一行输入一个正整数n,表示操作的个数。 接下来n行,每行输入一个字符串OP和一个整数x。OP只能是"ADD"、"SUB"、"BACK"、"SET"的其中之一,意义见上文。
输出描述: 输出一行n个整数,表示这个变量在每一个操作后的值,输出的整数之间用空格隔开,行末不允许有多余空格。
示例11 输入 7 ADD 2 SUB 3 BACK 1 BACK 1 BACK 1 BACK 2 SET 5
输出 2 -1 2 -1 2 2 5
说明 ①在增加2以后,变量的值为2。 ②在减少3以后,变量的值为-1。 ③向前回溯1次操作后变量的值与①状态时相同,变量的值变为2。 ④向前回溯1次操作后变量的值与②状态时相同,变量的值变为-1。 ⑤向前回溯1次操作后变量的值与③状态时相同,变量的值为2。 ⑥向前回溯2次操作后变量的值与③状态时相同,变量的值为2。 ⑦直接设置变量的值为5。
备注: 对于1010的测试数据,保证1≤n≤10,1≤x≤10001≤n≤10,1≤x≤1000。
对于100100的测试数据,保证1≤n≤105,1≤x≤10001≤n≤105,1≤x≤1000,保证BACK操作中1≤x≤1≤x≤当前已操作总数,并且在运算的过程中以及最终答案不会超过int型所表示的范围。
对于测试点2,在满足100100的测试数据的基础上额外保证只含有ADD、SUB两个操作。
对于测试点3,在满足100100的测试数据的基础上额外保证只含有ADD、SUB、SET三个操作。
#include<bits/stdc++.h>
using namespace std;
int a,h[100001],n;
string s;
int main()
{
cin>>n;
h[0]=0;
for(int i=1;i<=n;++i)
{
cin>>s>>a;
if(s=="ADD") h[i]=h[i-1]+a;
if(s=="SUB") h[i]=h[i-1]-a;
if(s=="SET") h[i]=a;
if(s=="BACK")h[i]=h[i-a-1];
cout<<h[i]<<endl;
}
}//T了,是我想的太简单了咩??