大佬求助,权值线段树
#include<bits/stdc++.h>
using namespace std;
const int N=5e6+15;
long long a[N],b[N],disc[N],tot=1;
int n,m;
long long rd[N],ld[N],size[N]={},val[N],ans[N];
void pushup(int x)
{
size[x]=size[x*2]+size[x*2+1];
}
void build(int x,int l,int r)
{
ld[x]=l;
rd[x]=r;
if(l==r)
{
val[x]=l;
return;
}
int mid=(l+r)/2;
build(x*2,l,mid);
build(x*2+1,mid+1,r);
}
void update(int x,int plas)
{
if(ld[x]==rd[x])
{
size[x]++;
return;
}
int mid=(ld[x]+rd[x])/2;
if(plas<=mid)
{
update(x*2,plas);
}
else
{
update(x*2+1,plas);
}
pushup(x);
}
long long query(int x,int loca)
{
//cout<<ld[x]<<" "<<rd[x];
if(ld[x]==rd[x])
{
//cout<<loca<<" ";
return ld[x];
}
int siz=size[x*2];
if(loca<=siz)
{
return query(x*2,loca);
}
else
{
return query(x*2+1,loca-siz);
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
disc[i]=a[i];
}
for(int i=1;i<=m;i++)
{
cin>>b[i];
}
sort(disc+1,disc+n+1);
int len=unique(disc+1,disc+n+1)-disc-1;
//cout<<len;
build(1,1,len);
for(int i=1;i<=n;i++)
{
int fw;
fw=lower_bound(disc+1,disc+n+1,a[i])-disc;
update(1,fw);
for(int j=tot;j<=m;j++)
{
if(b[tot]==i)
{
//cout<<i<<tot;
ans[tot]=query(1,tot);
//cout<<ans[tot];
tot++;
}
else
{
break;
}
}
}
for(int i=1;i<=m;i++)
{
cout<<disc[ans[i]]<<endl;
}
return 0;
}