hdu 1754 I Hate It 线段树

题目: 很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。人数<=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.


你可能感兴趣的:(hdu 1754 I Hate It 线段树)