洛谷传送门
【题目分析】
跟数学计算一题差不多。
就是开一个q那么大的线段树,初始叶子节点全部为0,操作都很常规。。。。比较氵的题。
【代码~】
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+10;;
const int INF=0x3f3f3f3f;
int q,cnt;
int maxx[MAXN],a[MAXN],mod,last;
int Read()
{
int i=0,f=1;
char c;
for(c=getchar();(c>'9'||c<'0')&&c!='-';c=getchar());
if(c=='-')
f=-1,c=getchar();
for(;c>='0'&&c<='9';c=getchar())
i=(i<<3)+(i<<1)+c-'0';
return i*f;
}
void push_up(int root)
{
maxx[root]=max(maxx[root<<1],maxx[root<<1|1]);
}
void update(int root,int l,int r,int x,int key)
{
if(l==r)
{
maxx[root]=key;
return ;
}
int mid=(l+r)>>1;
if(x<=mid)
update(root<<1,l,mid,x,key);
else
update(root<<1|1,mid+1,r,x,key);
push_up(root);
}
int query(int root,int l,int r,int L,int R)
{
if(l>R||r<L)
return 0;
if(L<=l&&r<=R)
return maxx[root];
int mid=l+r>>1;
if(R<=mid)
return query(root<<1,l,mid,L,R);
else
{
if(L>mid)
return query(root<<1|1,mid+1,r,L,R);
else
return max(query(root<<1,l,mid,L,mid),query(root<<1|1,mid+1,r,mid+1,R));
}
}
int main()
{
q=Read(),mod=Read();
for(int i=1;i<=q;++i)
{
char cz[5];
scanf("%s",&cz);
if(cz[0]=='A')
{
++cnt;
int x=Read();
x=(x%mod+last%mod)%mod;
update(1,1,q,cnt,x);
}
else
{
int x=Read();
last=query(1,1,q,cnt-x+1,cnt);
printf("%d\n",last);
}
}
return 0;
}