传送门
线段树比较裸的题。
第一眼动态开点,第二眼咦不对啊,直接搞就行。
有些网站比如说cogs好像必须要开LL。
#include
#include
#include
using namespace std;
#define LL long long
const int max_n=2e5+5;
const int max_tree=max_n*4;
int n,p;
int a,t,l;
int num,L,R,insert;
int sum[max_tree];
int ans;
inline void update(int now){
sum[now]=max(sum[now<<1],sum[now<<1|1]);
}
inline void build(int now,int l,int r,int x,int insert){
int mid=(l+r)>>1;
if (l==r){
sum[now]=insert;
return;
}
if (x<=mid)
build(now<<1,l,mid,x,insert);
else
build(now<<1|1,mid+1,r,x,insert);
update(now);
}
inline int query(int now,int l,int r,int lrange,int rrange){
int mid=(l+r)>>1,ans=0;
if (lrange<=l&&r<=rrange)
return sum[now];
if (lrange<=mid)
ans=max(ans,query(now<<1,l,mid,lrange,rrange));
if (mid+1<=rrange)
ans=max(ans,query(now<<1|1,mid+1,r,lrange,rrange));
return ans;
}
int main(){
scanf("%d%d",&n,&p);
a=0;
for (int i=1;i<=n;++i){
char ch=getchar();
while (ch!='A'&&ch!='Q') ch=getchar();
if (ch=='A'){
num++;
scanf("%d",&t);
insert=(int)((LL)(a+t)%p);
build(1,1,n,num,insert);
}
else{
scanf("%d",&l);
L=num-l+1;
R=num;
ans=query(1,1,n,L,R);
printf("%d\n",ans);
a=ans;
}
}
}