UPD:好像有两道题的代码逃跑了?= =就先不找了,反正都是水题。
精简题解系列第四弹。(其实也不是那么精简啊= =)
[JSOI2008]最大数maxnumber
单点修改,区间最大值查询,裸线段树
1 /************************************************************** 2 Problem: 1012 3 User: wsc500 4 Language: C++ 5 Result: Accepted 6 Time:944 ms 7 Memory:5368 kb 8 ****************************************************************/ 9 10 #include <cstdio> 11 #include <cstdlib> 12 #include <iostream> 13 #include <cstring> 14 #include <algorithm> 15 16 using namespace std; 17 #define MAXN (262144+2) 18 #define Q (262143) 19 #define bigger(a,b) ((a)>(b)?(a):(b)) 20 21 /*Gloable*/ 22 int m,d; 23 int T[MAXN*4]; 24 /*Function*/ 25 void insert(int p,int val){ 26 T[p+Q]=val; 27 int i=p+Q; 28 while (i!=0){ 29 T[i/2]=bigger(T[i/2*2],T[i/2*2+1]); 30 i/=2; 31 } 32 } 33 int query(int L,int R,int a,int b,int p){ 34 //printf("%d %d %d %d %d\n",L,R,a,b,p); 35 if (R>b) R=b; 36 if (L<a) L=a; 37 if (L==a&&R==b) return T[p]; 38 39 int mid=(a+b)/2; 40 int ans1,ans2; 41 ans1=ans2=0; 42 43 if (L<=mid) ans1=query(L,R,a,mid,p*2); 44 if (R>mid) ans2=query(L,R,mid+1,b,p*2+1); 45 46 return bigger(ans1,ans2); 47 } 48 int main() 49 { 50 memset(T,0,sizeof(T)); 51 int x,t=0,n=1; 52 char cmd[10]; 53 scanf("%d%d",&m,&d); 54 for (int i=1;i<=m;i++){ 55 //printf("hehe\n"); 56 scanf("%s%d",cmd,&x); 57 if (cmd[0]=='A'){ 58 insert(n,(x+t)%d); 59 n++; 60 } 61 if (cmd[0]=='Q'){ 62 //printf("hehe"); 63 t=query(n-x,n-1,1,Q+1,1); 64 printf("%d\n",t); 65 } 66 } 67 68 return 0; 69 }