Cod sursa(job #1317422)

Utilizator george_stelianChichirim George george_stelian Data 14 ianuarie 2015 21:29:30
Problema Nums Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 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;
char vaz[100010];

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++)
        if(v1[i].nr==v1[i-1].nr) v[v1[i].x].x=v[v1[i-1].x].x;
        else v[v1[i].x].x=i;
    for(int i=1;i<=n;i++)
        if(v[i].tip)
        {
            if(!vaz[v[i].x])
            {
                aib_update(v[i].x);
                vaz[v[i].x]=1;
            }
        }
        else g<<v1[kthelement(v[i].x)].nr<<"\n";
    return 0;
}