RMQ
开始学线段树啦,先贴个最简单的RMQ吧~神牛勿喷
code:
Program RMQ; const N=10; M=5; filename='RMQ'; Type TNode=record l,r,m:longint; end; var a:Array[1..N] of longint; node:array[1..4*N] of TNode; i,c,x,y,l,r:longint; Procedure openfile; begin assign(input,filename+'.in'); assign(output,filename+'.out'); reset(input); rewrite(output); end; Procedure closefile; begin close(input); close(output); end; Function Getmin(x,y:longint):longint; begin if x<y then exit(x) else exit(y); end; Procedure build(x,ll,rr:longint); var mid:longint; begin with node[x] do begin l:=ll; r:=rr; if ll=rr then begin m:=a[ll]; exit; end; mid:=(ll+rr) shr 1; build(2*x,ll,mid); build(2*x+1,mid+1,rr); m:=Getmin(node[2*x].m,node[2*x+1].m); end; end; Function Find(x,ll,rr:longint):longint; var mid:longint; begin with node[x] do begin if (ll=l) and (rr=r) then exit (m); mid:=(l+r) shr 1; if rr<=mid then exit(find(2*x,ll,rr)); if ll>mid then exit(find(2*x+1,ll,rr)); exit(getmin(find(2*x,ll,mid),find(2*x+1,mid+1,rr))); end; end; Procedure Modify(x,t:longint); var mid:longint; begin with node[x] do begin if l=r then begin m:=a[t]; exit; end; mid:=(l+r) shr 1; if t<=mid then modify(2*x,t) else modify(2*x+1,t); m:=getmin(node[2*x].m,node[2*x+1].m); end; end; Procedure main; begin for i:=1 to n do read(a[i]); build(1,1,n); for i:=1 to m do begin read(c); if c=1 then begin readln(l,r); writeln(find(1,l,r)); end; if c=2 then begin readln(x,y); a[x]:=y; modify(1,x); end; end; end; begin openfile; main; closefile; end.