Cod sursa(job #390032)

Utilizator freak93Adrian Budau freak93 Data 2 februarie 2010 19:42:53
Problema Nums Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>

using namespace std;

const char iname[]="nums.in";
const char oname[]="nums.out";
const int maxn=100005;

char s[maxn];

struct trie
{
    string s;
    int v;
} a[maxn];

 bool operator<(const trie& a,const trie& b)
    {
        if(a.s.length()==b.s.length())
            return a.s.compare(b.s)<0;
        return a.s.length()<b.s.length();
    }

int n,i,j,k,aib[maxn],r;
pair<int,int> Q[maxn];

void update(int x)
{
    int s=0,i;
    for(i=x;i;i-=i&-i)
        s+=aib[i];
    for(i=x-1;i;i-=i&-i)
        s-=aib[i];
    if(s==1)
        return;
    for(i=x;i<=k;i+=i&-i)
        ++aib[i];
}

int query(int x)
{
    int i,step;
    for(step=1;step<k;step<<=1);
    for(i=0;step&&x;step>>=1)
        if(i+step<=k&&aib[i+step]<x)
            x-=aib[i+step],i+=step;
    return i+1;
}

int main()
{
    freopen(iname,"r",stdin);
    freopen(oname,"w",stdout);
    scanf("%d\n",&n);
    for(i=1;i<=n;++i)
    {
        fgets(s,sizeof(s),stdin);
        if(s[strlen(s)-1]=='\n')
            s[strlen(s)-1]=0;
        if(s[0]=='1')
            a[++r].s=(s+2),a[r].v=i;
        else
            Q[i].first=0,sscanf(s+2,"%d",&Q[i].second);
    }

    sort(a+1,a+r+1);
    for(i=1;i<=r;Q[a[i].v].first=1,Q[a[i].v].second=k,++i)
        if(a[i].s.length()!=a[i-1].s.length()||a[i].s.compare(a[i-1].s)!=0)
            a[++k].s=a[i].s;
    /*for(i=1;i<=k;++i)
        printf("%s\n",a[i].s.c_str());
    printf("\n");*/
    for(i=1;i<=n;++i)
        if(Q[i].first==1)
            update(Q[i].second);
        else
            printf("%s\n",a[query(Q[i].second)].s.c_str());
    fclose(stdin);
    fclose(stdout);

    return 0;
}