Cod sursa(job #389965)

Utilizator freak93Adrian Budau freak93 Data 2 februarie 2010 17:04:38
Problema Nums Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 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];
pair<int,int> Q[maxn];

void update(int x)
{
    for(int 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;step>>=1)
        if(i+step<=k&&aib[i+step]<=x)
            x-=aib[i+step],i+=step;
    return i;
}

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[++k].s=(s+2),a[k].v=i;
        else
            Q[i].first=0,sscanf(s+2,"%d",&Q[i].second);
    }

    sort(a+1,a+k+1);
    for(i=1;i<=k;++i)
        Q[a[i].v].first=1,Q[a[i].v].second=i;
    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;
}