1 #include<stdio.h>
2 int n, m;
3 int a[10];
4 int tree[6<<2];
5
6 int minx(int a, int b)
7 {
8 return a<b?a:b;
9 }
10
11 void build(int rt, int l, int r)
12 {
13 if(l==r)
14 {
15 tree[rt]=a[l];
16 }
17 else
18 {
19 int m=(l+r)>>1;
20 build(rt<<1, l, m);
21 build((rt<<1)+1, m+1, r);
22
23 tree[rt]=minx(tree[rt<<1], tree[(rt<<1)+1]);
24 }
25 }
26
27 int query(int rt, int l, int r, int a, int b)
28 {
29 if(a<=l && b>=r)
30 return tree[rt];
31 if(a>r || b<l)
32 return -1;
33 int m=(l+r)>>1;
34 int x=query(rt<<1, l, m, a, b);
35 int y=query((rt<<1)+1, m+1, r, a, b);
36 if(x==-1)
37 return y;
38 if(y==-1)
39 return x;
40 if(x<=y)
41 return x;
42 return y;
43 }
44
45 void updata(int rt, int l, int r, int a, int b)
46 {
47 if(l==r)
48 {
49 tree[rt]=b;
50 }
51 else
52 {
53 int m=(l+r)>>1;
54 if(a<=m)
55 updata(rt<<1, l, m, a, b);
56 else
57 updata((rt<<1)+1, m+1, r, a, b);
58 tree[rt]=minx(tree[rt<<1], tree[(rt<<1)+1]);
59 }
60 }
61
62 int main()
63 {
64 while(scanf("%d%d", &n, &m)==2)
65 {
66 for(int i=1; i<=n; i++)
67 scanf("%d", &a[i]);
68 build(1, 1, n);
69
70 for(int j=0; j<m; j++)
71 {
72 char x;
73 int a, b;
74 getchar();
75 scanf("%c%d%d", &x, &a, &b);
76 if(x=='Q')
77 printf("%d
", query(1, 1, n, a, b));
78 else
79 updata(1, 1, n, a, b);
80 }
81 }
82 return 0;
83 }
http://blog.csdn.net/metalseed/article/details/8039326#