注意bit数组存放的是一个区间的最值。更新最值的时候要传递更新。查找的时候也要注意。如果已经不是在一个区间段上了,应该和num[]比。
program zhongcheng2;
var n,m,i,p,x,y:longint;
a:array[0..100000]of longint;
bit:array[0..100000]of longint;
function min(a,b:longint):longint;
begin
if a<b then min:=a else min:=b;
end;
function lowbit(x:longint):longint;
begin
lowbit:=x and (-x);
end;
function query(x,y:longint):longint;//查询
var ans:longint;
begin
ans:=a[y];
while x<=y do
begin
if y-lowbit(y)+1>=x then
begin
ans:=min(ans,bit[y]);
y:=y-lowbit(y);
end
else
begin
ans:=min(ans,a[y]);
y:=y-1;
end;
end;
query:=ans;
end;
procedure inset(x,y:longint);//插入
begin
while x<=m do
begin
bit[x]:=min(bit[x],y);
x:=x+lowbit(x);
end;
end;
procedure modify(x,y:longint);//修改
var j:longint;
begin
a[x]:=y;
while x<=m do
begin
bit[x]:=a[x];//防止bit中存的是以前的值,写a[x]是因为可能极端情况y不更新x:y在孩子中在孩子的父亲管辖的节点中
j:=1;
while j<lowbit(x) do
begin
bit[x]:=min(bit[x],bit[x-j]); //bit[x]表示x-lowbit(x)+1~x的最小值
j:=j*2;//x的二进制后有几个0,x就分多少层,j就乘几次
end;
x:=x+lowbit(x);//该节点可能更新父亲
end;
end;
begin
read(m,n);
fillchar(bit,sizeof(bit),127);//这里很神奇的只能填127最大
for i:=1 to m do
begin
read(a[i]);
inset(i,a[i]);
end;
for i:=1 to n do
begin
read(p,x,y);
if p=1 then
write(query(x,y),' ')
else
modify(x,y);
end;
end.
还有ZOJ Problem Set - 2859Matrix Searching
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1859