ROPE
#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
#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]); } }