题目:
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。人数<=200000,操作<=5000
分析:用线段树每一个定点保存该区间的最大值就好了。不懂的自己看程序。然后如果一开始每一个同学的分数都调用一次修改过程来做的话会超时,所以需要在建树的时候顺便把预处理给做了。
下面附程序:
var
n,m,i,x,y:longint;
c:char;
t:array[1..600000,1..3] of longint;
a:array[1..200000] of longint;
function max(x,y:longint):longint;
begin
if x>y then exit(x)
else exit(y);
end;
procedure hehe(d,l,r:longint);
var
m:longint;
begin
t[d,1]:=l;
t[d,2]:=r;
if l=r then
begin
t[d,3]:=a[l];
exit;
end;
m:=(l+r) div 2;
hehe(d*2,l,m);
hehe(d*2+1,m+1,r);
t[d,3]:=max(t[d*2,3],t[d*2+1,3]);
end;
procedure work(d,x,y:longint);
var
m:longint;
begin
if t[d,1]=t[d,2] then
begin
t[d,3]:=y;
exit;
end;
m:=(t[d,1]+t[d,2]) div 2;
if x<=m
then work(d*2,x,y)
else work(d*2+1,x,y);
t[d,3]:=max(t[d*2,3],t[d*2+1,3])
end;
function print(d,l,r:longint):longint;
var
m:longint;
begin
if (t[d,1]=l)and(t[d,2]=r) then exit(t[d,3]);
m:=(t[d,1]+t[d,2]) div 2;
if r<=m
then print:=print(d*2,l,r)
else if l>m
then print:=print(d*2+1,l,r)
else print:=max(print(d*2,l,m),print(d*2+1,m+1,r));
end;
begin
while not eof do
begin
readln(n,m);
for i:=1 to n do
read(a[i]);
readln;
hehe(1,1,n);
for i:=1 to m do
begin
read(c);
readln(x,y);
if c='Q'
then writeln(print(1,x,y))
else work(1,x,y);
end;
end;
end.