显然线段树模板题

 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 }
STD

 

posted on 2016-09-02 15:37  Absolutezero  阅读(135)  评论(0编辑  收藏  举报