rope大法好

//By Richard
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <ext/rope>
#include <ctime>
#define rep(x,y,z) for (int x=(y);(x)<=(z);(x)++)
#define per(x,y,z) for (int x=(y);(x)>=(z);(x)--)
#define log2(x) (31-__builtin_clz(x))
#define mod (int)(1e9+7)
#define inf 0x3f3f3f3f
#define cls(x) memset(x,0,sizeof(x))
#ifdef DEBUG
#define debugdo(X) X
#define debugndo(X)
#define debugout(X) cout<<(#X)<<"="<<(X)<<endl
#else
#define debugdo(X)
#define debugndo(X) X
#define debugout(X)
#endif // debug
#ifdef ONLINE_JUDGE
#define debugdo(X)
#define debugndo(X)
#define debugout(X)
#endif
#define putarray(x,n) rep(iiii,1,n) printf("%d ",x[iiii])
#define mp make_pair
using namespace std;
typedef pair<int,int> pairs;
typedef long long LL;
/////////////////////read4.0////////////////////////////////////
template <typename T>
inline void read(T &x)
{
    char ch;x=0;
    bool flag=false;
    ch=getchar();
    while (ch>'9'||ch<'0') 
    {
        if (ch=='-') flag=true;
        ch=getchar();
    }
    while ((ch<='9'&&ch>='0'))
    {
        x=x*10+ch-'0';
        ch=getchar();
    }
    if (flag) x*=-1;
}
template <typename T>
inline void read(T &x,T &y){read(x);read(y);}
template <typename T>
inline void read(T &x,T &y,T &z){read(x);read(y);read(z);}
/////////////////////graph///////////////////////////////
#ifdef graphv
const int maxn=,maxm=;
struct GRAPH
{
    int next[maxm],first[maxn],to[maxm],value[maxm],cnt;
    void addedge(int x,int y,int z){next[++cnt]=first[x];first[x]=cnt;to[cnt]=y;value[cnt]=z;}
    void addedge2(int x,int y,int z){addedge(x,y,z);addedge(y,x,z);}
    void addedge2(int x,int y,int z,int xx){addedge(x,y,z);addedge(y,x,xx);}
};
#endif
#ifdef graphnv
const int maxn=,maxm=;
struct GRAPH
{
    int next[maxm],first[maxn],to[maxm],cnt;
    void addedge(int x,int y){next[++cnt]=first[x];first[x]=cnt;to[cnt]=y;}
    void addedge2(int x,int y){addedge(x,y);addedge(y,x);}
};
#endif
/////////////////variables&functions////////////////////
using namespace __gnu_cxx;
crope cr;
int t,now,x;
char s[3333333],ch;
int main()
{
    read(t);
    while (t--)
    {
        ch=getchar();
        while (ch=='\n') ch=getchar();
        switch (ch)
        {
            case 'M':read(now);break;
            case 'P':now--;while(ch!='\n')ch=getchar();break;
            case 'N':now++;while(ch!='\n')ch=getchar();break;
            case 'I':
                read(x);
                rep(i,0,x-1) 
                {
                    s[i]=getchar();
                    if (s[i]=='\n') i--;
                }
                s[x]=0;
                cr.insert(now,s);
                getchar();
                break;
            case 'D':read(x);cr.erase(now,x);break;
            case 'G':read(x);cr.copy(now,x,s);s[x]=0;puts(s);break;
            puts("-1");
        }
    }
    return 0;
}