#include <bits/stdc++.h>
using namespace std;
const int M=200005;
struct node {
int mmin=0;
int sum=0;
int mmax=0;
int l,r;
} tree[M*4];
int n,m,input[M],mod,cnt;
void build(int now,int l,int r) {
tree[now].l=l;
tree[now].r=r;
if(l==r) {
tree[now].sum=0;
tree[now].mmax=0;
tree[now].mmin=0;
return;
}
int mid=(l+r)>>1;
build(now*2,l,mid);
build(now*2+1,mid+1,r);
tree[now].sum=tree[now*2].sum+tree[now*2+1].sum;
tree[now].mmax=max(tree[now*2].mmax,tree[now*2+1].mmax);
}
int p=0;
void update(int now,int tar,int k) {
if(tree[now].l==tree[now].r) {
tree[now].mmax=k;
p=now;
cout<<p<<" p "<<tree[p].mmax<<" nmb "<<endl;
return;
}
cout<<p<<" p "<<endl;
cout<<tree[now].mmax<<" "<<tree[p].mmax<<endl<<endl;
if(tar<=tree[now*2].r)
update(now*2,tar,k);
else
update(now*2+1,tar,k);
tree[now].mmax=max(tree[now*2].mmax,tree[now*2+1].mmax);
}
int query(int now,int l,int r) {
if(tree[now].l>=l && tree[now].r<=r)
return tree[now].mmax;
if(tree[now].r<l || tree[now].l>r)
return 0;
int s=(tree[now].r+tree[now].l)>>1;
return max(query(now*2+1,tree[now].l,tree[now].r),query(now*2,tree[now].l,s));
}
int main() {
cin>>m>>mod;
char z;
int t=0,cnt=0;
build(1,1,m);
for(int i=1,x; i<=m; i++) {
cin>>z>>x;
if(z=='A') {
// input[++cnt]=(x+t)%mod;
// cout<<input[cnt]<<' '<<t<<endl<<endl;
// build(1,1,cnt);
cnt++;
update(1,cnt,(x+t)%mod);
cout<<p<<" p "<<endl;
cout<<tree[p].l<<" "<<tree[p].r<<endl;
// cout<<(x+t)%mod<<' '<<tree[cnt].mmax<<" ";
// cout<<query(1,cnt,cnt)<<endl<<endl;
} else {
cout<<cnt<<" "<<x<<endl;
cout<<tree[9].l<<" "<<tree[9].r<<" "<<tree[9].mmax<<endl;
t=query(1,cnt-x+1,cnt);
cout<<t<<endl;
}
}
return 0;
}
调了三天了!! 求解!!