维护询问编号模 k 的余数棵线段树,但是 q=1 时炸了。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
#define ri register int
#define rd(n) n=read()
inline int read(void)
{
register int res=0,f=0;
register char c=getchar();
while(c<'0'||c>'9'){f^=(c=='-');c=getchar();}
while(c>='0'&&c<='9'){res=(res<<3)+(res<<1)+(c^48);c=getchar();}
return f?-res:res;
}
inline void fprint(int n)
{
if(n<0){putchar('-');n=-n;}
if(n>9) fprint(n/10);
putchar(n%10+'0');
}
inline void print(int n)
{
fprint(n);
putchar(' ');
}
const int N=200005;
int n,m,k,q,x,y,z,ans,res,mp[505][505],p[200005];
bool a[200005];
char s[505],c[505][505],op[5];
const int K=21;
int v[N],cnt;
#define lson(p) p<<1
#define rson(p) p<<1|1
struct SegmentTree{
struct Tree{
int l,r,dat,tag;
#define l(p) t[p].l
#define r(p) t[p].r
#define dat(p) t[p].dat
#define tag(p) t[p].tag
}t[N<<2];
inline int len(int p){return r(p)-l(p)+1;}
inline void pushup(int p){dat(p)=dat(lson(p))+dat(rson(p));}
void build(int p,int l,int r)
{
l(p)=l; r(p)=r; tag(p)=0;
if(l==r)
{
dat(p)=v[l];
return;
}
ri mid=(l+r)>>1;
build(lson(p),l,mid);
build(rson(p),mid+1,r);
pushup(p);
}
inline void spread(int p)
{
if(l(p)==r(p)) return;
if(tag(p))
{
tag(lson(p))^=1; tag(rson(p))^=1;
dat(lson(p))=len(lson(p))-dat(lson(p));
dat(rson(p))=len(rson(p))-dat(rson(p));
tag(p)=0;
}
}
void change(int p,int l,int r)
{
spread(p);
if(l<=l(p)&&r(p)<=r)
{
dat(p)=len(p)-dat(p);
tag(p)^=1;
return;
}
ri mid=(l(p)+r(p))>>1;
if(l<=mid) change(lson(p),l,r);
if(r>mid) change(rson(p),l,r);
pushup(p);
}
int query(int p,int l,int r)
{
spread(p);
if(l<=l(p)&&r(p)<=r) return dat(p);
int ans=0;
ri mid=(l(p)+r(p))>>1;
if(l<=mid) ans+=query(lson(p),l,r);
if(r>mid) ans+=query(rson(p),l,r);
return ans;
}
}T[K];
pair<int,int>w[200005];
signed main(void)
{
x=1; y=1;
rd(n); rd(m); rd(q); rd(k);
for(ri i=1;i<=n;++i)
{
scanf("%s",s+1);
for(ri j=1;j<=m;++j) mp[i][j]=(s[j]=='X');
}
for(ri i=1;i<=q;++i)
{
scanf("%s",op);
if(op[0]=='U')
{
a[i]=0;
p[i]=1;
}
if(op[0]=='D')
{
a[i]=1;
p[i]=1;
}
if(op[0]=='L')
{
a[i]=0;
p[i]=2;
}
if(op[0]=='R')
{
a[i]=1;
p[i]=2;
}
rd(w[i].first);
rd(w[i].second);
}
for(ri i=0;i<k;++i)
{
cnt=0;
for(ri j=1;j<=q;++j)
{
if(j%k==i)
v[++cnt]=a[j];
}
T[i].build(1,1,cnt);
//cout<<"ss\n"<<i<<' '<<cnt<<"ss\n";
}
for(ri i=1;i<=q;++i)
{
ri ts=(int)(i/k)+(bool)(i%k);
//cout<<"ss\n "<<ts<<" ss\n";
ri tt=T[i%k].query(1,ts,ts);
if(p[i]==1)
{
if(tt==0) x=max(1,x-w[i].first);
else x=min(n,x+w[i].first);
}
else
{
if(tt==0) y=max(1,y-w[i].first);
else y=min(m,y+w[i].first);
}
if(mp[x][y]==1&&w[i].second>0) T[i%k].change(1,ts+1,ts+w[i].second);
}
print(x); print(y);
return 0;
}