【线段树】最大值(单点)

题意:

在N(1<=N<=100000)个数A1…An组成的序列上进行M(1<=M<=100000)次操作,操作有两种:

(1)1 x y:表示修改A[x]为y;

(1)2 x y:询问x到y之间的最大值。

思路:

线段树,然后以最大值为权建数…..

程序:

 const
 maxn=500000;
var
 a:array [1..maxn] of longint;
 i,n,m,j,w,x,y:longint;
 d:array [1..maxn,1..3] of longint;

function max(x,y:longint):longint;
begin
 if x>y then exit(x)
        else exit(y);
end;

procedure hjy(i,l,r:longint);
var
 mid:longint;
begin
 d[i,1]:=l;
 d[i,2]:=r;
 d[i,3]:=0;
 if l=r then exit;
 mid:=(l+r) div 2;
 hjy(i*2,l,mid);
 hjy(i*2+1,mid+1,r);

end;

procedure fix(i,x,y:longint);
var
 mid:longint;
begin
 if (d[i,1]=d[i,2]) then
 begin
  d[i,3]:=y;
  exit;
 end;
 mid:=(d[i,1]+d[i,2]) div 2;
 if x>mid then fix(i*2+1,x,y)
          else fix(i*2,x,y);
 d[i,3]:=max(d[i*2+1,3],d[i*2,3]);
end;

function pos(i,x,y:longint):longint;
var
 mid:longint;
begin
 if (d[i,1]>=x) and (d[i,2]<=y) then exit(d[i,3]);
 mid:=(d[i,1]+d[i,2]) div 2;
 if y<=mid then pos:=pos(i*2,x,y)
  else if x>mid then pos:=pos(i*2+1,x,y)
   else pos:=max(pos(i*2,x,y),pos(i*2+1,x,y));
end;

begin
 readln(n);
 hjy(1,1,n);
 for i:=1 to n do
 begin
  readln(a[i]);
  fix(1,i,a[i]);
 end;
 readln(m);

 for i:=1 to m do
 begin
  readln(w,x,y);
  if w=1 then fix(1,x,y)
         else writeln(pos(1,x,y));
 end;
end.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值