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; }