T2我打了平衡树,TLE了
#pragma comment(linker,"/stack:200000000")
#pragma GCC optimize("Ofast,no-stack-protector")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define fastcall __attribute__((optimize("-O3")))
#include<cstdio>
#include<algorithm>
#define N 614514
using namespace std;
int seed,md=19260817;
void _srand(int x){seed=x;}
int _rand(){seed=(seed*7+13)%md;return seed;}
int n,m,q;
char s[N];
int rt[N];
struct fhq_treap{
int ch[N][2],tot,siz[N],rnd[N];
bool r[N];
char val[N];
#define lc ch[x][0]
#define rc ch[x][1]
int pushup(int x){siz[x]=siz[lc]+siz[rc]+1;return x;}
void split(int p,int k,int &x,int &y){
if(!p)return void(x=y=0);
pushdown(p);
if(siz[ch[p][0]]<k)split(ch[x=p][1],k-siz[ch[p][0]]-1,ch[p][1],y);
else split(ch[y=p][0],k,x,ch[p][0]);
pushup(p);
}
void rev(int x){swap(lc,rc);r[x]^=1;}
int merge(int x,int y){
if(!x||!y)return x+y;
pushdown(x),pushdown(y);
if(rnd[x]<=rnd[y]){rc=merge(rc,y);return pushup(x);}
else{ch[y][0]=merge(x,ch[y][0]);return pushup(y);}
}
void pushdown(int x){
if(!r[x])return;
if(lc)rev(lc);
if(rc)rev(rc);
r[x]^=1;
}
int newnode(char v){
int x=++tot;
rnd[x]=_rand();
val[x]=v;siz[x]=1;
lc=rc=0;
return x;
}
void print(int x){
if(!x)return;
pushdown(x);
print(lc);
putchar(val[x]);
print(rc);
}
}t;
#define split t.split
#define merge t.merge
#define rev t.rev
signed main(){
bool flg=0;
_srand(1919810);
scanf("%d%d",&n,&m);
if(n<750){
for(int i=1;i<=n;i++){
scanf("%s",s+1);
rt[i]=t.newnode(s[1]);
for(int j=2;j<=m;j++)rt[i]=merge(rt[i],t.newnode(s[j]));
}
}else{
for(int i=1;i<=n;i++){
scanf("%s",s+1);
for(int j=1;j<=m;j++)rt[j]=merge(rt[j],t.newnode(s[j]));
}
swap(n,m);
flg=1;
}
scanf("%d",&q);
while(q--){
int a,b;
scanf("%d%d",&a,&b);
if(flg)swap(a,b);
int f1=0,f2=0,f3=0,f4=0;
for(int i=1;i<=a;i++){
int x,y;
split(rt[i],b,x,y);
f1=merge(f1,x);
f2=merge(f2,y);
}
for(int i=a+1;i<=n;i++){
int x,y;
split(rt[i],b,x,y);
f3=merge(f3,x);
f4=merge(f4,y);
}
rev(f1);rev(f2);
rev(f3);rev(f4);
for(int i=1;i<=a;i++){
int x,y,e,f;
rt[i]=0;
split(f1,b,x,y);
rt[i]=merge(rt[i],x);
split(f2,m-b,e,f);
rt[i]=merge(rt[i],e);
f1=y;f2=f;
}
for(int i=a+1;i<=n;i++){
int x,y,e,f;
rt[i]=0;
split(f3,b,x,y);
rt[i]=merge(rt[i],x);
split(f4,m-b,e,f);
rt[i]=merge(rt[i],e);
f3=y;f4=f;
}
}
if(flg){
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
int x,y,e,f;
split(rt[j],i,x,y);
split(x,i-1,e,f);
putchar(t.val[f]);
x=merge(e,f);
rt[j]=merge(x,y);
}
puts("");
}
}else{
for(int i=1;i<=n;i++){
t.print(rt[i]);
puts("");
}
}
return 0;
}