Cod sursa(job #1667346)

Utilizator lupvasileLup Vasile lupvasile Data 28 martie 2016 21:06:27
Problema Nums Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
#ifdef INFOARENA
#define cout fout
#endif // INFOARENA
ifstream fin("nums.in");
ofstream fout("nums.out");
/// ////////////////////////////////

void read();

#define nmax 100003

int n,len;
int aib[nmax],ind[nmax],mp[nmax];
string v[nmax];

struct {int tip,pos;} op[nmax];

void update_aib(int pos)
{
    for(; pos<nmax; pos+=(pos&(-pos))) ++aib[pos];
}

int query_aib(int k)
{
    int step,pos=0;
    step=65536;
    for(; step; step>>=1)
        if(pos+step<=len)
            if(aib[pos+step]<k)
            {
                pos+=step;
                k-=aib[pos];
            }

    return pos+1;
}

bool cmp(int a,int b)
{
    if(v[a].size()!=v[b].size()) return v[a].size()<v[b].size();
    return v[a]<v[b];
}

int main()
{
    int i;

    read();
    sort(ind+1,ind+len+1,cmp);
    for(i=1; i<=len; ++i) mp[ind[i]]=i;

    for(i=1;i<=n;++i)
        if(op[i].tip==1) update_aib(mp[op[i].pos]);
        else cout<<v[ind[query_aib(op[i].pos)]]<<'\n';

        return 0;
}

void read()
{
    int i;
    fin>>n;
    for(i=1; i<=n; ++i)
    {
        fin>>op[i].tip;
        if(op[i].tip==1)
        {
            fin>>v[++len];
            ind[len]=len;
            op[i].tip=1;
            op[i].pos=len;
        }
        else
        {
            fin>>op[i].pos;
        }
    }
}