题意:
在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.