显然线段树模板题
1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 const int N=200000; 5 long long INF=1000000000000; 6 int len,m,n; 7 long long maxl[(N|1)<<2],d,t; 8 void modify(int,int,int,int,long long), 9 build(int,int,int); 10 long long max(long long,long long), 11 query(int,int,int,int,int); 12 int main(){ 13 char c[3]; 14 len=t=0; 15 build(1,1,N); 16 scanf("%d %lld",&m,&d); 17 for (int i=1;i<=m;i++){ 18 scanf("%s %d",c,&n); 19 if (c[0]=='A'){ 20 len++; 21 modify(1,1,N,len,(t+n)%d); 22 } 23 if (c[0]=='Q'){ 24 t=query(1,1,N,len-n+1,len); 25 printf("%lld\n",t); 26 } 27 } 28 return 0; 29 } 30 long long max(long long x,long long y){ 31 return x>y?x:y; 32 } 33 void update(int i){ 34 maxl[i]=max(maxl[i<<1],maxl[i<<1|1]); 35 } 36 void build(int i,int l,int r){ 37 maxl[i]=-INF; 38 if (l==r) return; 39 int mid=(l+r)>>1; 40 build(i<<1,l,mid); 41 build(i<<1|1,mid+1,r); 42 update(i); 43 } 44 void modify(int i,int l,int r,int x,long long d){ 45 if (l==r){ 46 maxl[i]=d;return; 47 } 48 int mid=(l+r)>>1; 49 if (x<=mid) modify(i<<1,l,mid,x,d); 50 else modify(i<<1|1,mid+1,r,x,d); 51 update(i); 52 } 53 long long query(int i,int l,int r,int L,int R){ 54 if (L<=l&&r<=R) return maxl[i]; 55 int mid=(l+r)>>1; 56 long long ans=-INF; 57 if (L<=mid) ans=query(i<<1,l,mid,L,R); 58 if (R>mid) ans=max(ans,query(i<<1|1,mid+1,r,L,R)); 59 return ans; 60 }