Cod sursa(job #2166376)

Utilizator DavidLDavid Lauran DavidL Data 13 martie 2018 16:50:11
Problema Nums Scor 65
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <fstream>
#include <string>
#include <algorithm>
#define MAX 100005
using namespace std;
ifstream fi("nums.in");
ofstream fo("nums.out");

int n;
int total;
string nr[MAX];
int q[MAX],qq[MAX],qs[MAX],F[MAX],A[MAX],M[MAX],ind[MAX];

bool cmp(int x,int y)
{
    string a=nr[x],b=nr[y];
    if(a.size()==b.size())
        return a<b;
    return a.size()<b.size();
}

void update(int poz)
{
    for (int i=poz; i<MAX; i+=(i&(-i)))
        A[i]++;
}

string query(int val)
{
    int step,poz=0;
    for (step=65536; step; step>>=1)
        if (poz+step<=total)
            if (A[poz+step]<val)
            {
                poz+=step;
                val-=A[poz];
            }
    return nr[ind[poz+1]];
}

int main()
{
    fi>>n;
    for (int i=1; i<=n; i++)
    {
        int tip;
        fi>>tip;
        if (tip==0)
            fi>>qq[i];
        else
        {
            fi>>nr[++total];
            q[i]=1;
            qs[i]=total;
            ind[total]=total;
        }
    }
    sort(ind+1,ind+total+1,cmp);

    for (int i=1; i<=total; i++)
        M[ind[i]]=i;

    for (int i=1; i<=total; i++)
        if (nr[ind[i]].size()==nr[ind[i-1]].size() &&nr[ind[i]]==nr[ind[i-1]])
            M[ind[i]]=M[ind[i-1]];

    for (int i=1; i<=n; i++)
    {
        if (q[i] && !F[M[qs[i]]])
        {
            update(M[qs[i]]);
            F[M[qs[i]]]=1;
        }
        else if (q[i]==0)
            fo<<query(qq[i])<<"\n";
    }

    fi.close();
    fo.close();
    return 0;
}