rt,MLE on 8 and 11
#include<iostream>
using namespace std;
const int L=-2e9,R=2e9,Max=2e5+1,INF=0x3f3f3f3f;
int tot=1;
int a[Max],b[Max];
struct node{
int l,r;
int lson,rson;
int num,val;
node(){
lson=0;rson=0;num=0;
}
}T[25*Max];
void push_up(int x){
T[x].num=T[T[x].lson].num+T[T[x].rson].num;
}
void insert(int &x,int l,int r,int val){
//cout<<l<<" "<<r<<endl;
if(x==0){
x=++tot;
T[x].l=l;T[x].r=r;
}
if(l==r){
T[x].val=val;
T[x].num++;
return;
}
int mid;
if((T[x].l+T[x].r)<0){
mid=(T[x].l+T[x].r-1)/2;
}else{
mid=(T[x].l+T[x].r)/2;
}
if(val<=mid){
insert(T[x].lson,l,mid,val);
}else{
insert(T[x].rson,mid+1,r,val);
}
push_up(x);
}
int query(int p,int val){
//cout<<T[p].l<<" "<<T[p].r<<" "<<val<<endl;
if(T[p].l==T[p].r){
return p;
}
if(T[T[p].lson].num>=val){
return query(T[p].lson,val);
}else{
return query(T[p].rson,val-T[T[p].lson].num);
}
}
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=m;i++){
cin>>b[i];
}
int xx=1;
int p=1;
T[1].l=L;T[1].r=R;
for(int i=1;i<=n;i++){
insert(xx,L,R,a[i]);
while(b[p]==i&&p<=m){
cout<<T[query(1,p)].val<<endl;p++;
}
}
}