kb-07专题线段树-02--单点修改,区间最值
1 /* 2 区间单点该值,区间查询最大值; 3 hdu-1754 4 */ 5 #include<iostream> 6 #include<cstdio> 7 #include<cstring> 8 using namespace std; 9 typedef struct 10 { 11 int l,r; 12 int value; 13 }V; 14 int n,m,a[200005]={0},MAX=-1; 15 V tr[800005]={0}; 16 void build(int i,int l,int r) 17 { 18 tr[i].l=l; 19 tr[i].r=r; 20 if(l==r) 21 { 22 tr[i].value=a[l]; 23 return ; 24 } 25 int mid=(l+r)/2; 26 build(i<<1,l,mid); 27 build(i<<1|1,mid+1,r); 28 tr[i].value=max(tr[i<<1].value,tr[i<<1|1].value); 29 } 30 void Query(int i,int l,int r) 31 { 32 if(tr[i].l==l&&tr[i].r==r) 33 { 34 MAX=MAX>=tr[i].value?MAX:tr[i].value; 35 return ; 36 } 37 i=i<<1; 38 if(l<=tr[i].r) 39 { 40 if(r<=tr[i].r) 41 Query(i,l,r); 42 else 43 Query(i,l,tr[i].r); 44 } 45 i+=1; 46 if(r>=tr[i].l) 47 { 48 if(l>=tr[i].l) 49 Query(i,l,r); 50 else 51 Query(i,tr[i].l,r); 52 } 53 } 54 void Update(int i,int l,int x) 55 { 56 if(tr[i].l==tr[i].r&&tr[i].l==l) 57 { 58 tr[i].value=x; 59 return ; 60 } 61 int t=i<<1; 62 if(l<=tr[t].r) 63 Update(t,l,x); 64 t+=1; 65 if(l>=tr[t].l) 66 Update(t,l,x); 67 tr[i].value=max(tr[i<<1].value,tr[i<<1|1].value); 68 } 69 int main() 70 { 71 while(scanf("%d%d",&n,&m)!=EOF) 72 { 73 memset(a,0,sizeof(a)); 74 for(int i=1;i<=n;i++) 75 { 76 scanf("%d",&a[i]); 77 } 78 build(1,1,n); 79 /* for(int i=1;i<11;i++) 80 printf("I:%d %d\n",i,tr[i].value); 81 */ char s; 82 int x1,x2; 83 while(m--) 84 { 85 getchar(); 86 scanf("%c%d%d",&s,&x1,&x2); 87 if(s=='Q') 88 { 89 MAX=-1; 90 Query(1,x1,x2); 91 printf("%d\n",MAX); 92 } 93 else 94 { 95 Update(1,x1,x2); 96 } 97 } 98 } 99 return 0; 100 }