HDU1754 I Hate It 点修改 区间查询 模板题

  1 #include <cstdio>//大白书上说节点数最多有2*n-1个 n为区间长度 
  2 #include <cstring>//这个题开420000的数组却RE了 换成100W+就过了……sad
  3 #include <cstdlib>
  4 #include <algorithm>
  5 #include <iostream>
  6 
  7 
  8 using namespace std;
  9 
 10 int st[1048576];
 11 int gr[210000];
 12 
 13 int max(int x,int y)
 14 {
 15     return x>=y ? x:y;
 16 }
 17 
 18 int creat(int node,int l,int r)
 19 {
 20     if(l == r)
 21     {
 22         st[node] = gr[l];
 23         return st[node];
 24     }
 25     int m = (l+r)/2;
 26 
 27     st[node] = max(creat(node+node,l,m),creat(node+node+1,m+1,r));
 28 
 29     return st[node];
 30 }
 31 
 32 int query(int ml,int mr,int node,int l,int r)
 33 {
 34     if(ml == l && mr == r)
 35         return st[node];
 36     int m = (l+r)/2;
 37     if(mr <= m)
 38     {
 39         return query(ml,mr,node+node,l,m);
 40     }
 41     if(m < ml)
 42     {
 43         return query(ml,mr,node+node+1,m+1,r);
 44     }
 45     return max(query(ml,m,node+node,l,m),query(m+1,mr,node+node+1,m+1,r));
 46 }
 47 
 48 int change(int site,int grade,int node,int l,int r)
 49 {
 50     if(l == r && r == site)
 51     {
 52         st[node] = grade;
 53         return st[node];
 54     }
 55     int m = (l+r)/2;
 56     if(site <= m)
 57     {
 58         st[node] = change(site,grade,node+node,l,m);
 59         return st[node];
 60     }
 61     if(m < site)
 62     {
 63         st[node] = change(site,grade,node+node+1,m+1,r);
 64         return st[node];
 65     }
 66 }
 67 
 68 int q[110];
 69 void output(int n)
 70 {
 71     int t;
 72     int s = 0,e = 1;
 73     q[0] = 1;
 74     int i = 1,j = 1;
 75     while(1)
 76     {
 77 
 78         t = q[s++];
 79         printf("st[%d] = %d ",t,st[t]);
 80         q[e++] = t+t;
 81         q[e++] = t+t+1;
 82         if(t == n+n-1) break;
 83         if(i == j)
 84         {
 85             i = 1;
 86             j *= 2;
 87             printf("\n");
 88         }
 89         else i++;
 90     }
 91 }
 92 
 93 int main()
 94 {
 95     int n,m,T;
 96     int i;
 97     char order[5];
 98     int l,r;
 99     int site ,grade;
100 
101     while(scanf("%d %d",&n,&m) != EOF)
102     {
103         for(i = 1;i <= n; i++)
104             scanf("%d",&gr[i]);
105 
106         creat(1,1,n);
107         //output(n);
108 
109         while(m--)
110         {
111             scanf("%s",order);
112             if(order[0] == 'Q')
113             {
114                 scanf("%d %d",&l,&r);
115                 printf("%d\n",query(l,r,1,1,n));
116                 //output(n);
117             }
118             else if(order[0] == 'U')
119             {
120                 scanf("%d %d",&site,&grade);
121                 change(site,grade,1,1,n);
122                 //output(n);
123             }
124         }
125     }
126     return 0;
127 }
原文地址:https://www.cnblogs.com/zmx354/p/3107053.html