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 }

 

posted on 2015-05-30 22:34  bai_yan  阅读(188)  评论(0编辑  收藏  举报

导航