树状数组求第K小元素

来源:互联网 发布:waves mac 编辑:程序博客网 时间:2024/06/09 18:12
#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;}
0 0