zrq495
www.zrq495.com

线段树。

代码如下:

 1 #include<iostream>
 2 #include<cstdio>
 3 #define max 2000002
 4 
 5 using namespace std;
 6 
 7 typedef struct
 8 {
 9     int l, r;
10     int val;
11 }node;
12 
13 node t[4*max];
14 
15 void build(int l, int r, int rt)
16 {
17     t[rt].l=l;
18     t[rt].r=r;
19     if (l == r)
20     {
21         scanf("%d", &t[rt].val);
22         return ;
23     }
24     int m=(l+r)>>1;
25     build(l, m, rt<<1);
26     build(m+1, r, rt<<1|1);
27     t[rt].val= t[rt<<1].val > t[rt<<1|1].val ? t[rt<<1].val : t[rt<<1|1].val;
28 }
29 
30 void update(int p, int v, int rt)
31 {
32     if (t[rt].r == t[rt].l)
33     {
34         t[rt].val=v;
35         return ;
36     }
37     int m=(t[rt].r+t[rt].l)>>1;
38     if (p <= m) update(p, v, rt<<1);
39     else update(p, v, rt<<1|1);
40     t[rt].val= t[rt<<1].val > t[rt<<1|1].val ? t[rt<<1].val : t[rt<<1|1].val;
41 }
42 
43 int maxv(int L, int R, int rt)
44 {
45     if (L == t[rt].l && R == t[rt].r)
46         return t[rt].val;
47     int m=(t[rt].r+t[rt].l)>>1;
48     if (L > m)
49         return maxv(L, R, rt<<1|1);
50     else if (R <= m)
51         return maxv(L, R, rt<<1);
52     else
53     {
54         int t1=maxv(L, m, rt<<1);
55         int t2=maxv(m+1, R, rt<<1|1);
56         if (t1 > t2) return t1;
57         else return t2;
58     }
59 
60 }
61 
62 int main()
63 {
64     int a, b;
65     int n, m;
66     char op[2];
67     while(scanf("%d%d%*c", &n, &m) != EOF)
68     {
69         build(1, n, 1);
70         while(m--)
71         {
72             scanf("%s%d%d%*c", op, &a, &b);
73             if (op[0] == 'U')
74                 update(a, b, 1);
75             else if (op[0] == 'Q')
76                 printf("%d\n", maxv(a, b, 1));
77         }
78     }
79     return 0;
80 }
posted on 2012-08-09 21:15  zrq495  阅读(150)  评论(0编辑  收藏  举报