#include <ext/rope>
using namespace __gnu_cxx;
int a[1000];
rope<int> x;
rope<int> x(a,a + n);
rope<int> a(x);
x->at(10); //cout<<x->at(10)<<endl;
x[10];
x->push_back(x) // 在末尾添加x
x->insert(pos,x) // 在pos插入x
x->erase(pos,x) // 从pos开始删除x个
x->replace(pos,x) // 从pos开始换成x
x->substr(pos,x) // 提取pos开始x个
描述 给一个空数列,有M次操作,每次操作是以下三种之一: (1)在数列后加一个数 (2)求数列中某位置的值
撤销掉最后进行的若干次操作(1和3)
输入 第一行一个正整数M。
接下来M行,每行开头是一个字符,若该字符为’A’,则表示一个加数操作,接下来一个整数x,表示在数列后加一个整数x;若该字符为’Q’,则表示一个询问操作,接下来一个整数x,表示求x位置的值;若该字符为’U’,则表示一个撤销操作,接下来一个整数x,表示撤销掉最后进行的若干次操作。
输出 对每一个询问操作单独输出一行,表示答案。
样例输入
9
A 1
A 2
A 3
Q 3
U 1
A 4
Q 3
U 2
Q 3
样例输出
3
4
3
提示 1<=M<=10^5
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h>
#include<ext/rope>
using namespace std;
using namespace __gnu_cxx;
rope<int> *now[100005];
void print(rope<int> s)
{
for (int i = 0; i < s.length(); i++)
{
cout << s[i] << " ";
}
cout << endl;
}
int cnt = 0;
int main()
{
now[0] = new rope<int>();
//cout << now[0] << endl;
int n, m;
cin >> m;
//print(*now[0]);
char ch;
int x;
for (int i = 1; i <= m; i++)
{
//now[i] = new rope<int>(*now[i - 1]);
cin >> ch >> x;
if (ch == 'A')
{
++cnt;
now[cnt] = new rope<int>(*now[cnt - 1]);
now[cnt]->push_back(x);
}
else if (ch == 'Q')
{
cout << now[cnt]->at(x-1) << endl;
}
else if (ch == 'U')
{
++cnt;
now[cnt] = new rope<int>(*now[cnt - 1 - x]);
}
print(*now[cnt]);
}
}
View Code