rt,调一天力。
数组开大貌似没用。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2004;
const int T=34;
ll R,C,m,nx,ny,e[N][N],to[N][N];
ll f[N][T],tree[N<<4][N];
string op;
void push_up(ll p){
for(int i=1;i<=R;i++){
tree[p][i]=tree[p<<1|1][tree[p<<1][i]];
}
}
void Build_Tree(ll p,ll l,ll r){
if(l==r){
for(int i=1;i<=R;i++){
tree[p][i]=to[l][i];
}
return;
}
ll mid=(l+r)>>1;
Build_Tree(p<<1,l,mid);
Build_Tree(p<<1|1,mid+1,r);
push_up(p);
}
void update(ll q,ll p,ll l,ll r){
if(l==r){
for(int i=1;i<=R;i++){
tree[p][i]=to[l][i];
}
return;
}
ll mid=(l+r)>>1;
if(q<=mid){
update(q,p<<1,l,mid);
}else{
update(q,p<<1|1,mid+1,r);
}
push_up(p);
}
void Find_Next(ll &x,ll &y){
ll tx1=x>1?x-1:R;
ll tx2=x;
ll tx3=x==R?1:x+1;
ll ty=y==C?1:y+1;
ll maxn=0,id;
if(e[tx1][ty]>maxn){
maxn=e[tx1][ty];
id=tx1;
}
if(e[tx2][ty]>maxn){
maxn=e[tx2][ty];
id=tx2;
}
if(e[tx3][ty]>maxn){
maxn=e[tx3][ty];
id=tx3;
}
x=id;
y=ty;
}
void Binary_Lifting(){
for(int i=1;i<=R;i++){
f[i][0]=tree[1][i];
}
for(int j=1;j<=30;j++){
for(int i=1;i<=R;i++){
f[i][j]=f[f[i][j-1]][j-1];
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>R>>C;
for(int i=1;i<=R;i++){
for(int j=1;j<=C;j++){
cin>>e[i][j];
}
}
for(int i=1;i<=R;i++){
for(int j=1;j<=C;j++){
ll x=i,y=j;
Find_Next(x,y);
to[j][i]=x;
}
}
Build_Tree(1,1,C);
Binary_Lifting();
nx=ny=1;
cin>>m;
for(int i=1;i<=m;i++){
cin>>op;
if(op[0]=='c'){
ll a,b,k;
cin>>a>>b>>k;
e[a][b]=k;
b=b>1?b-1:C;
for(int j=1;j<=R;j++){
ll x=j,y=b;
Find_Next(x,y);
to[b][j]=x;
}
update(b,1,1,C);
Binary_Lifting();
}else{
ll k;
cin>>k;
if(k&&ny!=1){
Find_Next(nx,ny);
k--;
}
ll c=k/C;
k%=C;
for(int j=30;j>=0;j--){
if(c&(1<<j)){
c^=(1<<j);
nx=f[nx][j];
}
}
while(k--){
Find_Next(nx,ny);
}
cout<<nx<<' '<<ny<<'\n';
}
}
}