点修改区间查询 HDU1754
1 #include <iostream> 2 #include <cstdio> 3 4 using namespace std; 5 6 int an[200010]; 7 struct Node 8 { 9 int l; 10 int r; 11 int ma; 12 }bn[800010]; 13 14 void build(int k,int l,int r) 15 { 16 bn[k].l=l; 17 bn[k].r=r; 18 if(l==r) 19 { 20 bn[k].ma=an[l]; 21 return ; 22 } 23 int lk=k*2; 24 int rk=lk+1; 25 int mid=(l+r)/2; 26 build(lk,l,mid); 27 build(rk,mid+1,r); 28 bn[k].ma=max(bn[lk].ma,bn[rk].ma); 29 } 30 31 void change(int k,int i,int a) 32 { 33 if(bn[k].l==i&&bn[k].r==i) 34 { 35 bn[k].ma=a; 36 return ; 37 } 38 int lk=k*2; 39 int rk=lk+1; 40 if(bn[lk].r>=i) 41 change(lk,i,a); 42 else if(bn[rk].l<=i) 43 change(rk,i,a); 44 bn[k].ma=max(bn[lk].ma,bn[rk].ma); 45 } 46 47 int search(int k,int l,int r) 48 { 49 if(bn[k].l==l&&bn[k].r==r) 50 { 51 return bn[k].ma; 52 } 53 int lk=k*2; 54 int rk=lk+1; 55 if(bn[lk].r>=r) 56 return search(lk,l,r); 57 else if(bn[rk].l<=l) 58 return search(rk,l,r); 59 else 60 return max(search(lk,l,bn[lk].r),search(rk,bn[rk].l,r)); 61 } 62 63 int main() 64 { 65 int n,m; 66 while(scanf("%d%d",&n,&m)!=EOF) 67 { 68 for(int i=1;i<=n;i++) 69 scanf("%d",&an[i]); 70 build(1,1,n); 71 for(int i=0;i<m;i++) 72 { 73 char ca; 74 int a,b; 75 scanf(" %c ",&ca); 76 scanf("%d%d",&a,&b); 77 if(ca=='Q') 78 printf("%d\n",search(1,a,b)); 79 else if(ca=='U') 80 change(1,a,b); 81 } 82 } 83 return 0; 84 }