bzoj 1012 最大数maxnumber
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1012
题解:
直接创建一个宽度为200000的线段树,然后就是单点修改和区间查询操作了
不开long long见祖宗,十年OI一场空!
1 #include<cstdio> 2 #define LL long long 3 #define MAXN 800010 4 LL n=200000,m,MOD,y,y1,y2,v,t,maxv[MAXN]; 5 inline LL max(LL x,LL y) 6 { 7 return x>y?x:y; 8 } 9 void update(LL o,LL L,LL R) 10 { 11 LL lc=o<<1,rc=o<<1|1,M=(L+R)>>1; 12 if(L==R) 13 { 14 maxv[o]=v; 15 return; 16 } 17 if(y<=M)update(lc,L,M); 18 else update(rc,M+1,R); 19 maxv[o]=max(maxv[lc],maxv[rc]); 20 } 21 LL query(LL o,LL L,LL R) 22 { 23 LL lc=o<<1,rc=o<<1|1,M=(L+R)>>1; 24 if(L>=y1&&R<=y2)return maxv[o]; 25 LL ans=0; 26 if(y1<=M)ans=max(ans,query(lc,L,M)); 27 if(y2>M)ans=max(ans,query(rc,M+1,R)); 28 return ans; 29 } 30 int main() 31 { 32 scanf("%lld %lld",&m,&MOD); 33 while(m--) 34 { 35 char t1; 36 LL t2; 37 scanf("\n%c ",&t1); 38 scanf("%lld",&t2); 39 if(t1=='A') 40 { 41 v=(t2+t)%MOD; 42 ++y; 43 update(1,1,n); 44 } 45 else 46 { 47 y1=y-t2+1;y2=y; 48 t=query(1,1,n); 49 printf("%lld\n",t); 50 } 51 } 52 return 0; 53 }