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 |
求数据,离线splay一直WAtype node=record x,y,num,k:longint; end; var ans,pretty,fa,count:array[0..100100] of longint; son:array[0..100100,1..2] of longint; a:array[0..50010] of node; j,root,n,q,i,t:longint; procedure mid(x:longint); begin if son[x,1]<>0 then mid(son[x,1]); write(pretty[x],' '); if son[x,2]<>0 then mid(son[x,2]); end; procedure update(x:longint); begin count[x]:=count[son[x,1]]+count[son[x,2]]+1; end; procedure clear(x:longint); begin son[x,1]:=0; son[x,2]:=0; count[x]:=1; end; procedure swap(var a,b:node); var c:node; begin c:=a; a:=b; b:=c; end; procedure rotate(x,w:longint); var y:longint; begin y:=fa[x]; if fa[y]<>0 then begin if son[fa[y],1]=y then son[fa[y],1]:=x else son[fa[y],2]:=x; end; fa[x]:=fa[y]; son[y,3-w]:=son[x,w]; if son[x,w]<>0 then fa[son[x,w]]:=y; son[x,w]:=y; fa[y]:=x; update(y); update(x); end; procedure splay(x:longint); var y:longint; begin while fa[x]<>0 do begin y:=fa[x]; if fa[y]=0 then begin if son[y,1]=x then rotate(x,2) else rotate(x,1); end else begin if son[fa[y],1]=y then begin if son[y,1]=x then begin rotate(y,2); rotate(x,2); end else begin rotate(x,1); rotate(x,2); end; end else begin if son[y,1]=x then begin rotate(x,2); rotate(x,1); end else begin rotate(y,1); rotate(x,1); end; end; end; end; update(x); root:=x; end; function succ(x:longint):longint; var p:longint; begin p:=son[x,2]; while son[p,1]<>0 do p:=son[p,1]; exit(p); end; function kth(x:longint):longint; var p:longint; begin p:=root; while p<>0 do begin if count[son[p,1]]+1=x then exit(pretty[p]); if count[son[p,1]]+1>x then p:=son[p,1] else begin x:=x-count[son[p,1]]-1; p:=son[p,2]; end; end; end; procedure insert(x:longint); var p:longint; begin inc(t); clear(x); if t=1 then begin root:=x; fa[x]:=0; end else begin p:=root; repeat inc(count[p]); if pretty[p]>pretty[x] then begin if son[p,1]=0 then break; p:=son[p,1]; end else begin if son[p,2]=0 then break; p:=son[p,2]; end; until false; fa[x]:=p; if pretty[p]>pretty[x] then son[p,1]:=x else son[p,2]:=x; splay(x); end; end; procedure delete(x:longint); var p,y:longint; begin splay(x); dec(t); if t=0 then begin root:=0; t:=0; fillchar(fa,sizeof(fa),0); fillchar(son,sizeof(son),0); fillchar(count,sizeof(count),0); exit; end; if (son[x,1]<>0) and (son[x,2]<>0) then begin p:=succ(x); y:=fa[p]; if y<>x then begin son[y,1]:=son[p,2]; if son[p,2]<>0 then fa[son[p,2]]:=y; update(y); end; root:=p; fa[p]:=0; son[p,1]:=son[x,1]; fa[son[x,1]]:=p; if y<>x then begin son[p,2]:=son[x,2]; fa[son[x,2]]:=p; end; end else begin if son[x,1]<>0 then begin root:=son[x,1]; fa[son[x,1]]:=0; end else if son[x,2]<>0 then begin root:=son[x,2]; fa[son[x,2]]:=0; end; end; update(root); clear(x); end; procedure sort(l,r: longint); var i,j,x,y: longint; begin i:=l; j:=r; x:=a[(l+r) shr 1].x; repeat while (a[i].x<x) do inc(i); while (x<a[j].x) do dec(j); if not(i>j) then begin swap(a[i],a[j]); inc(i); j:=j-1; end; until i>j; if l<j then sort(l,j); if i<r then sort(i,r); end; begin readln(n,q); for i:=1 to n do read(pretty[i]); readln; for i:=1 to q do begin readln(a[i].x,a[i].y,a[i].k); a[i].num:=i; end; count[0]:=0; sort(1,q); { for i:=1 to q do writeln(a[i].x,' ',a[i].y);} root:=0; for i:=a[1].x to a[1].y do insert(i); ans[a[1].num]:=kth(a[1].k); { mid(root); readln; writeln(t);} for i:=2 to q do begin if a[i].x>a[i-1].y then begin root:=0; t:=0; fillchar(fa,sizeof(fa),0); fillchar(son,sizeof(son),0); fillchar(count,sizeof(count),0); for j:=a[i].x to a[i].y do begin insert(j); end; end else begin for j:=a[i-1].y+1 to a[i].y do insert(j); for j:=a[i-1].x to a[i].x-1 do begin delete(j); end; end; { mid(root); readln; writeln(t);} ans[a[i].num]:=kth(a[i].k); end; for i:=1 to q do writeln(ans[i]); end. Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator