代码如下,求解,样例过了。
#include <bits/stdc++.h>
using namespace std;
const int N=4e5+10;
long long t=1,cnt;long long m,d;long long ans;
struct node{
long long lc,rc;
long long maxn;
}n[N];
void pushup(long long u){
n[u].maxn = max(n[n[u].lc].maxn,n[n[u].rc].maxn);
return;
}
void build(int u,int l,int r){
if(l==r){
n[u].maxn = 0;
return;
}
long long mid = (l+r)>>1;
n[u].lc = ++t;
build(n[u].lc,1,mid);
n[u].rc = ++t;
build(n[u].rc,mid+1,r);
pushup(u);
return;
}
void updata(long long u,long long l,long long r,long long x,long long y){
if(l==r){
n[u].maxn = y;
return;
}
long long mid = (l+r)>>1;
if(x<=mid){
updata(n[u].lc,l,mid,x,y);
}else {
updata(n[u].rc,mid+1,r,x,y);
}
pushup(u);
return;
}
void query(long long u,long long l,long long r,long long zl,long long zr){
if(l==zl&&r==zr){
ans = n[u].maxn;
//ans = max(ans,n[u].maxn);
return;
}
long long mid = (l+r)>>1;
if(zr<=mid){
query(n[u].lc,l,mid,zl,zr);
}else {
if(zl>mid){
query(n[u].rc,mid+1,r,zl,zr);
}else {
long long tmp;
query(n[u].lc,l,mid,zl,mid);
tmp = ans;
query(n[u].rc,mid+1,r,mid+1,zr);
ans = max(ans,tmp);
}
}
return;
}
int main(){
cin>>m>>d;
char ch;long long num;
build(1,1,m);
for(int i=1;i<=m;i++){
cin>>ch>>num;
if(ch=='A'){
cnt++;
num = (num+ans)%d;
updata(1,1,m,cnt,num);
}else{
//ans = 0;
query(1,1,m,cnt-num+1,cnt);
cout<<ans<<endl;
}
}
return 0;
}