HDU 1754 I Hate It(线段树版)

题目链接

找最大,这里居然会超时。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 #define N 200001
 5 struct node
 6 {
 7     int l;
 8     int r;
 9     int v;
10 }tree[4*N];
11 int max(int a,int b)
12 {
13     return a>b?a:b;
14 }
15 void build(int l,int r,int rt)
16 {
17     int m;
18     tree[rt].l = l;
19     tree[rt].r = r;
20     if(l == r)
21     {
22         scanf("%d",&tree[rt].v);
23         return ;
24     }
25     m = (l+r)>>1;
26     build(l,m,rt<<1);
27     build(m+1,r,rt<<1|1);
28     tree[rt].v = max(tree[rt<<1].v,tree[rt<<1|1].v);
29 }
30 void update(int pos,int sc,int rt)
31 {
32     int m;
33     if(tree[rt].l == tree[rt].r)
34     {
35         tree[rt].v = sc;
36         return ;
37     }
38     m = (tree[rt].l + tree[rt].r) >> 1;
39     if(pos > m)
40     {
41         update(pos,sc,rt<<1|1);
42     }
43     else
44     {
45         update(pos,sc,rt<<1);
46     }
47     tree[rt].v = max(tree[rt<<1].v,tree[rt<<1|1].v);
48 }
49 int query(int L,int R,int rt)
50 {
51     int m;
52     if(L == tree[rt].l&&R == tree[rt].r)
53     {
54         return tree[rt].v;
55     }
56     m = (tree[rt].l + tree[rt].r) >> 1;
57     if(L > m)
58     {
59         return query(L,R,rt<<1|1);
60     }
61     else if(R <= m)
62     {
63         return query(L,R,rt<<1);
64     }
65     else
66     {
67         return  max(query(L,m,rt<<1),query(m+1,R,rt<<1|1));
68     }
69 }
70 int main()
71 {
72     int n,i,m,x,y;
73     char str[100];
74     while(scanf("%d%d%*c",&n,&m)!=EOF)
75     {
76         memset(tree,0,sizeof(tree));
77         build(1,n,1);
78         for(i = 1;i <= m;i ++)
79         {
80             scanf("%s%d%d",str,&x,&y);
81             if(str[0] == 'Q')
82             {
83                 printf("%d\n",query(x,y,1));
84             }
85             else if(str[0] == 'U')
86             {
87                 update(x,y,1);
88             }
89         }
90     }
91     return 0;
92 }
posted @ 2012-08-09 11:56  Naix_x  阅读(168)  评论(0编辑  收藏  举报