HDU1754.I Hate It
直接模板就可以了
代码:
1 //B 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 #include<cmath> 6 #include<algorithm> 7 #include<cstdlib> 8 #include<queue> 9 #include<stack> 10 using namespace std; 11 typedef long long ll; 12 const int inf=0x3f3f3f3f; 13 const double eps=1e-5; 14 const int maxn=5*1e5+10; 15 #define lson l,m,rt<<1 16 #define rson m+1,r,rt<<1|1 17 int sum[maxn<<2],MAX[maxn<<2]; 18 19 void PushUp(int rt){ 20 //sum[rt]=sum[rt<<1]+sum[rt<<1|1]; 21 MAX[rt]=max(MAX[rt<<1],MAX[rt<<1|1]); 22 } 23 24 void build(int l,int r,int rt){ 25 if(l==r){ 26 //scanf("%d",&sum[rt]); 27 scanf("%d",&MAX[rt]); 28 return ; 29 } 30 int m=(l+r)>>1; 31 build(lson); 32 build(rson); 33 PushUp(rt); 34 } 35 /* 36 //单点增减 37 void update(int p,int add,int l,int r,int rt){ 38 if(l==r){ 39 sum[rt]+=add; 40 return ; 41 } 42 int m=(l+r)>>1; 43 if(p<=m)update(p,add,lson); 44 else update(p,add,rson); 45 PushUp(rt); 46 } 47 */ 48 49 //单点更新 50 void update(int p,int sc,int l,int r,int rt){ 51 if(l==r){ 52 MAX[rt]=sc; 53 return ; 54 } 55 int m=(l+r)>>1; 56 if(p<=m)update(p,sc,lson); 57 else update(p,sc,rson); 58 PushUp(rt); 59 } 60 /* 61 //区间求和 62 int query(int L,int R,int l,int r,int rt){ 63 if(L<=l&&r<=R){ 64 return sum[rt]; 65 } 66 int m=(l+r)>>1; 67 int ret=0; 68 if(L<=m)ret+=query(L,R,lson); 69 if(R>m) ret+=query(L,R,rson); 70 return ret; 71 } 72 */ 73 74 //区间最值 75 int query(int L,int R,int l,int r,int rt){ 76 if(L<=l&&r<=R){ 77 return MAX[rt]; 78 } 79 int m=(l+r)>>1; 80 int ret=0; 81 if(L<=m)ret=max(ret,query(L,R,lson)); 82 if(R>m) ret=max(ret,query(L,R,rson)); 83 return ret; 84 } 85 86 87 int main(){ 88 int n,m; 89 while(~scanf("%d%d",&n,&m)){ 90 build(1,n,1); 91 char s[10];int a,b; 92 while(m--){ 93 scanf("%s%d%d",s,&a,&b); 94 if(s[0]=='Q')printf("%d ",query(a,b,1,n,1)); 95 else update(a,b,1,n,1); 96 } 97 } 98 return 0; 99 }