luogu P1531 I hate it

这是道裸的线段树题,而且不需要区间修改。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 using namespace std;
 5 int n,m,a[200001],ans[5001],f1,f2;
 6 char s;
 7 struct k1{
 8     int l;
 9     int r;
10     int mid;
11     int date;
12 }tree[1000000];
13 void build(int l,int r,int pos)
14 {
15     tree[pos].l=l;
16     tree[pos].r=r;
17     tree[pos].mid=(l+r)/2;
18     if(l==r)
19     tree[pos].date=a[l];
20     else
21     {
22         build(l,tree[pos].mid,pos<<1);
23         build(tree[pos].mid+1,r,(pos<<1)+1);
24         tree[pos].date=max(tree[pos<<1].date,tree[(pos<<1)+1].date);
25     }
26 }
27 int query(int l,int r,int pos)
28 {
29     if((tree[pos].l==l)&&(tree[pos].r==r))
30     return tree[pos].date;
31     if(r<=tree[pos].mid)
32     return query(l,r,pos<<1);
33     if(l>tree[pos].mid)
34     return query(l,r,(pos<<1)+1);
35     return max(query(l,tree[pos].mid,pos<<1),query(tree[pos].mid+1,r,(pos<<1)+1));
36 }
37 void update(int num,int pos)
38 {
39     if(tree[pos].l==tree[pos].r)
40     tree[pos].date=a[num];
41     else
42     {
43         if(num<=tree[pos].mid)
44         {
45             update(num,pos<<1);
46             if(tree[pos<<1].date>tree[pos].date)
47             tree[pos].date=tree[pos<<1].date;
48         }
49         else
50         {
51             update(num,(pos<<1)+1);
52             if(tree[(pos<<1)+1].date>tree[pos].date)
53             tree[pos].date=tree[(pos<<1)+1].date;
54         }    
55     }
56 }
57 int main()
58 {
59     scanf("%d%d",&n,&m);
60     for(int i=1;i<=n;i++)
61     scanf("%d",&a[i]);
62     build(1,n,1);
63     for(int i=1;i<=m;i++)
64     {
65         scanf("%s",&s);
66         if(s=='Q')
67         {
68             scanf("%d%d",&f1,&f2);
69             ans[i]=query(f1,f2,1);        
70         }
71         if(s=='U')
72         {
73             scanf("%d%d",&f1,&f2);
74             if(a[f1]<f2)
75             {
76                 a[f1]=f2;
77                 update(f1,1);                
78             }
79         }
80     }
81     for(int i=1;i<=m;i++)
82     {
83         if(ans[i]!=0)
84         printf("%d\n",ans[i]);
85     }
86     return 0;
87 }

 

posted @ 2018-03-04 17:30  蒟蒻炖辣鸡  阅读(222)  评论(0编辑  收藏  举报