Segment Tree
#include <bits/stdc++.h>using namespace Std;struct rect{int L, R, C, X;}; struct Rec{int x, p, ans, rank;}; Rect tree[800004];rec a[200004], Get[20000];bool cmpx (const rec &A, const rec &b) {return a.x<b.x;} BOOL Cmpp (const REC &A, const rec &b) {return A.P<B.P;} void build (int i, int l, int r) {tree[i].l = L;TREE[I].R = R;TREE[I].C = 0;if (l!=r) {build (2*i, L, (l+r)/2); Build (2*i+1, ( L+R)/2+1, R);} else{tree[i].x = a[r].x;}} void change (int i, int p) {if (TREE[I].L==TREE[I].R) {Tree[i].c=1;return;} if (P<=TREE[2*I].R) {change (2*i, p);} else {change (2*i+1, p);} tree[i].c= tree[2*i].c + tree[2*i+1].c;} int find (int i, int x) {if (TREE[I].L==TREE[I].R) {return tree[i].x;} if (X<=TREE[2*I].C) {return find (2*i, x);} else {return find (2*i+1, x-tree[2*i].c);}} int main () {//freopen ("d.in", "R", stdin); int T, L, N, m;cin>>t;for (int i=1; i<=t; i++) {cout<< "Case #" <<I<< ":" <<endl;cin>>n>>m;for (int i=1; i<=n; i++) {Cin>>a[i].x;a[i].p=i;} for (int i=1; i<=m; i++) {cin>>get[i].x;get[i].p=i;} Sort (a+1, a+1+n, cmpx); for (int i=1; i<=n; i++) {A[i].ans = i;} Build (1, 1, n); sort (a+1, a+1+n, cmpp); sort (get+1, get+1+m, cmpx); l = 1;get[m+1].x=-1;for (int i=1; i<=n; i++) {//cout< ; <a[i].ans<<endl;change (1, A[i].ans), while (i==get[l].x) {get[l].ans=find (1, l); l++;}} Sort (get+1, get+1+m, CMPP); for (int i=1; i<=m; i++) {Cout<<get[i].ans<<endl;}} return 0;}
Chang ' An (Black box-segment tree)