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]);
        }
}
View Code
原文地址:https://www.cnblogs.com/Aragaki/p/8824727.html