Cod sursa(job #996662)

Utilizator alexalghisiAlghisi Alessandro Paolo alexalghisi Data 12 septembrie 2013 14:45:52
Problema Nums Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <iostream>
#include <fstream>
#include <algorithm>

#define DN 100005
using namespace std;

int v[DN],q[DN],dp[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;
}


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;
    }
    cout<<x<<" "<<rez<<endl;
    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;

            for(int bit=30;bit>=0 && k;--bit)
            {
                if( ( 1<<bit ) <= v[0] && dp[ rez + (1<<bit) ]<=k )
                {
                    rez+=(1<<bit);
                    k-=dp[rez];
                }
            }
            g<<v[rez]<<"\n";
        }
        else
        {
            int x;
            f>>x;
            caut(x);
        }

    }


    return 0;
}