程序博客网 > 知美术馆预约
来源:互联网 发布:知美术馆预约 编辑:程序博客网 时间:2024/04/29 16:48
var a,num:array[1..18,0..100001]of longint; b,p:array[0..100001]of longint; n,m,i,j,k:longint;procedure init;begin readln(n,m); for i:=1 to n do begin read(b[i]);p[i]:=i; end;end;procedure kp(s,t:longint);var i,j,x,y:longint;begin i:=s;j:=t;x:=b[p[(i+j)>>1]]; repeat while b[p[i]]<x do inc(i); while b[p[j]]>x do dec(j); if i<=j then begin y:=p[i];p[i]:=p[j];p[j]:=y; inc(i);dec(j) end until i>j; if i<t then kp(i,t);if j>s then kp(s,j);end;procedure build(h,s,t:longint);var k,mid:longint;begin k:=0;mid:=(s+t)>>1; for i:=s to t do if a[h,i]<=mid then begin a[h+1,s+k]:=a[h,i];inc(k);num[h,i]:=k; end else begin a[h+1,mid+i-s+1-k]:=a[h,i];num[h,i]:=k end; if k>1 then build(h+1,s,mid);if mid+1<t then build(h+1,mid+1,t)end;function find(h,s,t,ss,tt,k:longint):longint; //在区间s,t中查询区间ss,tt的第K值var mid,l,r:longint;begin if ss=tt then exit(b[p[a[h,ss]]]); if s=ss then l:=0 else l:=num[h,ss-1]; r:=num[h,tt]; mid:=(s+t)>>1; if k>r-l then exit(find(h+1,mid+1,t,mid+ss-s-l+1,mid+tt-s-r+1,k-(r-l))) //被查区间实际是mid+[(ss-1)-s+1]-l+1,mid+(tt-s+1)-r else exit(find(h+1,s,mid,s+l,s+r-1,k)); //被查区间实际是(s-1)+l+1,(s-1)+rend;procedure doit;var x,y,z:longint;begin kp(1,n); for i:=1 to n do a[1,p[i]]:=i; build(1,1,n); for i:=1 to m do begin readln(x,y,z); writeln(find(1,1,n,x,y,z)); end;end;begin init; doit;end.