int getkth(int t,int k) { if (k<=SBT[SBT[t].left].s) return getkth(SBT[t].left,k); if (k>=SBT[SBT[t].left].s+2) return getkth(SBT[t].right,k-SBT[SBT[t].left].s-1); return SBT[t].key; }
int main() { int i,j; tail=0; II=0; head=0; scanf("%d%d",&N,&M); for (i=1;i<=N;i++) scanf("%d",&A[i]); for (i=1;i<=M;i++) scanf("%d",&u[i]); //Work j=1; SBT[0].init(0); SBT[0].s=0; for (i=1;i<=N;i++) { insert(head,A[i]); while (j<=M && i==u[j]) { printf("%d\n",getkth(head,++II)); j++; } } }
int getkth(int s[], int m, int l[], int n, int k){ // let m <= n if (m > n) return getkth(l, n, s, m, k); if (m == 0) return l[k - 1]; if (k == 1) return min(s[0], l[0]); int i = min(m, k / 2), j = min(n, k / 2); if (s[i - 1] > l[j - 1]) return getkth(s, m, l + j, n - j, k - j); else return getkth(s + i, m - i, l, n, k - i); return 0; }
double findMedianSortedArrays(int A[], int m, int B[], int n) { int l = (m + n + 1) >> 1; int r = (m + n + 2) >> 1; return (getkth(A, m ,B, n, l) + getkth(A, m, B, n, r)) / 2.0; }