Cod sursa(job #1315658)

Utilizator george_stelianChichirim George george_stelian Data 12 ianuarie 2015 23:16:23
Problema Nums Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>

using namespace std;

struct str
{
    int tip,x;
}v[100010];
struct numar
{
    int x;
    string nr;
}v1[100010];
int aib[100010],n,logn;

int cmp(numar a,numar b)
{
    if(a.nr.size()==b.nr.size()) return a.nr<b.nr;
    else return a.nr.size()<b.nr.size();
}

void aib_update(int i)
{
    for(;i<=n;i+=i&(-i)) aib[i]++;
}

int kthelement(int k)
{
    int x=0;
    for(int i=logn;i>=0;i--)
        if(x+(1<<i)<=n && k>aib[x+(1<<i)])
        {
            x+=1<<i;
            k-=aib[x];
        }
    return x+1;
}

int main()
{
    ifstream f("nums.in");
    ofstream g("nums.out");
    int m=0;
    f>>n;
    for(logn=1;1<<(logn+1)<=n;logn++);
    for(int i=1;i<=n;i++)
    {
        f>>v[i].tip;
        if(v[i].tip)
        {
            f>>v1[++m].nr;
            v1[m].x=i;
        }
        else f>>v[i].x;
    }
    sort(v1+1,v1+1+m,cmp);
    for(int i=1;i<=m;i++) v[v1[i].x].x=i;
    for(int i=1;i<=n;i++)
        if(v[i].tip) aib_update(v[i].x);
        else g<<v1[kthelement(v[i].x)].nr<<"\n";
    return 0;
}