线段树的一道好(裸)题啊,正好好久都没有写线段树了,练一下手
因为至多有M次操作所以无所谓多少个直接建个1~M的树好了
剩下乱搞一遍AC
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int MAXN=1e6;
struct sgt_tree{
int l,r,maxn;
sgt_tree(){
maxn=-1e9;
}
}a[MAXN];
int m,d,t=0,sum=0,In;
char A;
void build(int o,int l,int r){
a[o].l=l,a[o].r=r;
if(l==r) return;
build(o*2,l,(l+r)>>1);
build(o*2+1,((l+r)>>1)+1,r);
}
int query(int o,int l,int r){
int mid=(a[o].l+a[o].r)>>1;
if(a[o].l==l&&a[o].r==r) return a[o].maxn;
if(l>mid) return query(o*2+1,l,r);
else if(r<=mid) return query(o*2,l,r);
else return max(query(o*2,l,mid),query(o*2+1,mid+1,r));
}
void add(int o,int p,int x){
a[o].maxn=max(a[o].maxn,x);
if(a[o].l==a[o].r) return;
if(p>(a[o].l+a[o].r)/2) add(o*2+1,p,x);
else add(o*2,p,x);
}
int main(){
ios::sync_with_stdio(false);
cin>>m>>d;
build(1,1,m);
for(int i=1;i<=m;i++){
cin>>A;
if(A=='Q'){
cin>>In;
t=query(1,sum-In+1,sum);
printf("%d\n",t);
}
if(A=='A'){
cin>>In;
add(1,++sum,(In+t)%d);
}
}
return 0;
}