Cod sursa(job #996710)

Utilizator alexalghisiAlghisi Alessandro Paolo alexalghisi Data 12 septembrie 2013 15:37:22
Problema Nums Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <iostream>
#include <fstream>
#include <algorithm>

#define DN 100005
using namespace std;

int v[DN],q[DN],dp[DN];
bool ap[DN];

inline int lsb(int x)
{
    return (x&(x-1))^x;
}
void update(int poz,int val)
{
    for(;poz<=v[0];poz+=lsb(poz))
        dp[poz]+=val;
}

/*
int query(int poz)
{
    int rez=0;
    for(;poz;poz-=lsb(poz))
        rez+=dp[poz];
    return rez;
}
*/


void caut(int x)
{
    int st=1,dr=v[0],rez=-1;
    while(st<=dr)
    {
        int mij=(st+dr)/2;
        if( x<= v[mij])
        {
            rez=mij;
            dr=mij-1;
        }
        else
            st=mij+1;
    }
    ap[rez]=1;
    update(rez,1);
}



int main()
{
    int n;
    ifstream f("nums.in");
    ofstream g("nums.out");
    f>>n;
    for(;n;--n)
    {
        int op;
        f>>op;
        if(!op)
            f>>q[++q[0]];
        else
            f>>v[++v[0]];
    }
    sort(v+1,v+v[0]+1);

    f.close();
    f.open("nums.in");

    f>>n;

    for(;n;--n)
    {
        int op;
        f>>op;
        if(!op)
        {

            int k,rez=0;
            f>>k;
            --k;

            for(int bit=30;bit>=0 && k;--bit)
            {
                if( rez + ( 1<<bit ) <= v[0] && dp[ rez + (1<<bit) ]<=k )
                {
                    rez+=(1<<bit);
                    k-=dp[rez];
                }
            }
            while(!ap[++rez]);

            g<<v[rez]<<"\n";
        }
        else
        {
            int x;
            f>>x;
            caut(x);
        }

    }

    return 0;
}