| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Psacal居然比c++短我偷懒只写了单旋
program poj3580;
const maxlongint=maxlongint>>1;
var
l,r,m,ad,w,s:array[0..200010] of longint;
f:array[0..200010] of boolean;
i,j,ll,rr,t,tmp,root,n,mt,a,b,c,d:longint;
task:string;
rd:char;
procedure update(i:longint);
begin
if i=0 then exit;
ll:=l[i];
rr:=r[i];
s[i]:=s[ll]+s[rr]+1;
m[i]:=w[i];
if m[ll]<m[i]
then m[i]:=m[ll];
if m[rr]<m[i]
then m[i]:=m[rr];
end;
procedure left(var i:longint);
begin
j:=r[i];
r[i]:=l[j];
l[j]:=i;
update(i);
update(j);
i:=j;
end;
procedure right(var i:longint);
begin
j:=l[i];
l[i]:=r[j];
r[j]:=i;
update(i);
update(j);
i:=j;
end;
procedure put(var i,j:longint;k:boolean);
begin
if i=0 then exit;
if k then
begin
tmp:=l[i];
l[i]:=r[i];
r[i]:=tmp;
end;
f[i]:=f[i] xor k;
inc(w[i],j);
inc(ad[i],j);
inc(m[i],j);//!
end;
procedure find(var i:longint;p:longint);
begin
put(l[i],ad[i],f[i]);
put(r[i],ad[i],f[i]);
ad[i]:=0;
f[i]:=false; //!
if p<=s[l[i]] then
begin
find(l[i],p);
right(i);
end
else
if p=s[l[i]]+1
then exit
else
begin
find(r[i],p-s[l[i]]-1); left(i);
end;
end;
begin
readln(n);
t:=n; m[0]:=maxlongint;
root:=n+2; t:=root;//!
i:=1; w[1]:=maxlongint; update(i);
for i:=2 to n+1 do
begin
readln(w[i]);
l[i]:=i-1;
update(i);
end;
w[root]:=maxlongint;
l[root]:=i;
update(root);
readln(mt);
for mt:=1 to mt do
begin
task:='';rd:='!';
while rd<>' ' do
begin
task:=task+rd;read(rd);
end;
if task='!ADD' then
begin
readln(a,b,c);
b:=b+2;
find(root,a);
find(root,b);
put(r[l[root]],c,false);
update(l[root]);
update(root);
end else
if task='!REVERSE' then
begin
readln(a,b);
b:=b+2;
c:=0;
find(root,a);
find(root,b);
put(r[l[root]],c,true);
end else
if task='!REVOLVE' then
begin
readln(a,b,c);
while c<0 do c:=c+b-a+1;
c:=b-c mod (b-a+1)+1;
b:=b+2;
find(root,c);
find(l[root],a);
find(r[root],b-c);
a:=r[l[root]];
b:=l[r[root]];
c:=l[root];
r[c]:=b;
l[root]:=a;
l[r[root]]:=0;
update(c);
update(r[root]);
update(root);
find(root,1);
l[root]:=c;
update(root);
end else
if task='!INSERT' then
begin
readln(a,b);
find(root,a+1);//!
inc(t);
r[t]:=r[root];
r[root]:=t;
w[t]:=b;
update(t);
update(root);
end else
if task='!DELETE' then
begin
readln(a);inc(a);
find(root,a);
find(r[root],1);
l[r[root]]:=l[root];
root:=r[root];
update(root);
end else begin
readln(a,b);
b:=b+2;
find(root,a);
find(root,b);
writeln(m[r[l[root]]]);
end;
end;
end.
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator