很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。

不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。

 

线段树裸题,单点修改,区间求最大值。

 1 #include<stdio.h>
 2 const int maxm=200005;
 3 
 4 int a[maxm],st[maxm<<2];
 5 char s[10];
 6 
 7 int max(int a,int b){
 8     return a>b?a:b;
 9 }
10 
11 void build(int o,int l,int r){
12     if(l==r){
13         st[o]=a[l];
14         return;
15     }
16     int m=l+((r-l)>>1);
17     build(o<<1,l,m);
18     build(o<<1|1,m+1,r);
19     st[o]=max(st[o<<1],st[o<<1|1]);
20 }
21 
22 void update(int o,int l,int r,int x,int c){
23     if(l==r){
24         st[o]=c;
25         return;
26     }
27     int m=l+((r-l)>>1);
28     if(x<=m)update(o<<1,l,m,x,c);
29     if(x>=m+1)update(o<<1|1,m+1,r,x,c);
30     st[o]=max(st[o<<1],st[o<<1|1]);
31 }
32 
33 int query(int o,int l,int r,int ql,int qr){
34     if(ql<=l&&qr>=r)return st[o];
35     int m=l+((r-l)>>1);
36     int maxx=-0x3f3f3f3f;
37     if(ql<=m)maxx=max(maxx,query(o<<1,l,m,ql,qr));
38     if(qr>=m+1)maxx=max(maxx,query(o<<1|1,m+1,r,ql,qr));
39     return maxx;
40 }
41 
42 int read(){
43     int x=0,d=1;
44     char c=getchar();
45     while((c>'9'||c<'0')&&c!='-')c=getchar();
46     if(c=='-'){
47         d=-1;
48         c=getchar();
49     }
50     while(c>='0'&&c<='9'){
51         x=x*10+c-'0';
52         c=getchar();
53     }
54     return d*x;
55 }
56 
57 int main(){
58     int n,m;
59     while(scanf("%d%d",&n,&m)!=EOF){
60         int i;
61         for(i=1;i<=n;i++)a[i]=read();
62         build(1,1,n);
63         for(i=1;i<=m;i++){
64             scanf("%s",s);
65             if(s[0]=='Q'){
66                 int ql=read();
67                 int qr=read();
68                 printf("%d\n",query(1,1,n,ql,qr));
69             }
70             else if(s[0]=='U'){
71                 int x=read();
72                 int c=read();
73                 update(1,1,n,x,c);
74             }
75         }
76     }
77     return 0;
78 }
View Code