Cod sursa(job #1316851)

Utilizator catalinrebegeaUNIBUC-Claudia Catarig catalinrebegea Data 14 ianuarie 2015 11:18:21
Problema Nums Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <fstream>
#include <algorithm>
#define Nmax 200005

using namespace std;

struct query
{
    int tip,val;
    string nr;
} a[Nmax];

struct el
{
    int poz;
    string nr;
} v[Nmax];
int len,aib[Nmax],poz[Nmax],Vmax;
bool fr[Nmax];

inline void Update(int poz, int val)
{
    int i;
    for(i=poz;i<=Vmax;i+=(i&(-i))) aib[i]+=val;
}

inline int Kth_Element(int k)
{
    int sum=0,i,poz=0;
    for(i=20;i>=0;--i)
    {
        if(poz+(1<<i)>Vmax) continue;
        if(sum+aib[poz+(1<<i)]<k)
        {
            poz+=(1<<i);
            sum+=aib[poz];
        }
    }
    return poz+1;
}

inline bool cmp(const el A, const el B)
{
    if(A.nr.size()<B.nr.size()) return true;
    return A.nr<B.nr;
}

inline void Normalize()
{
    int i;
    sort(v+1,v+len+1,cmp);
    a[v[1].poz].val=1; poz[1]=v[1].poz;
    for(i=2;i<=len;++i)
    {
        a[v[i].poz].val=a[v[i-1].poz].val;
        if(v[i].nr!=v[i-1].nr) ++a[v[i].poz].val;
        poz[a[v[i].poz].val]=v[i].poz;
    }
    Vmax=a[v[len].poz].val;
}
/// E O BULANEALA CARE NU AR TREBUI SA IA 100
/// PUR SI SIMPLU IEI UPDATE-URILE SI LE NORMALIZEZI APOI DAI CU AIB SAU AINT
int main()
{
    int n,i;
    ifstream fin("nums.in");
    ofstream fout("nums.out");
    fin>>n;
    for(i=1;i<=n;++i)
    {
        fin>>a[i].tip>>a[i].nr;
        if(a[i].tip)
        {
            ++len;
            v[len].nr=a[i].nr; v[len].poz=i;
        }
    }
    Normalize();
    for(i=1;i<=n;++i)
    {
        if(a[i].tip)
        {
            if(!fr[a[i].val])
            {
                Update(a[i].val,1);
                //fout<<a[i].val<<"---\n";
                fr[a[i].val]=true;
            }
        }
        else
        {
           // fout<<Kth_Element(a[i].nr[0]-'0')<<"\n";
            fout<<a[poz[Kth_Element(a[i].nr[0]-'0')]].nr<<"\n";
        }
    }
    return 0;
}