#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <set>
#include <vector>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 1000+10;
int tr[N];
int n;
int lowbit(int x)
{
return x & (-x);
}
void update(int val,int x)
{
while(x<=n)
{
tr[x] += val;
x += lowbit(x);
}
return;
}
int find(int k)
{
int ans = 0;
for(int i= 20;i>=0;i--)
{
ans |= (1<<i);
if(ans>n || tr[ans]>=k)
ans ^= (1<<i);
else k -= tr[ans];
}
return ans + 1;
}
int main()
{
int x;
memset(tr,0,sizeof(tr));
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&x),update(1,x);
while(1)
{
int m;
scanf("%d",&m);
cout<<find(m)<<endl;
}
return 0;
}
树状数组求第K小元素
最新推荐文章于 2023-06-21 22:43:57 发布