很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
线段树裸题,单点修改,区间求最大值。
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
",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 }