Cod sursa(job #2166441)

Utilizator DavidLDavid Lauran DavidL Data 13 martie 2018 17:07:54
Problema Nums Scor 65
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <fstream>
#include <string>
#include <algorithm>
#define DIM 100001
using namespace std;
ifstream fi("nums.in");
ofstream fo("nums.out");

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

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

int lsb(int x)
{
    return (x^(x-1))&x;
}

void update(int poz)
{
    for(int i=poz; i<DIM; i+=lsb(i))
        A[i]++;
}

string query(int k)
{
    int step,pos=0;
    step=65536;
    for(; step; step>>=1)
        if(pos+step<=total)
            if(A[pos+step]<k)
            {
                pos+=step;
                k-=A[pos];
            }
    return nr[ind[pos+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,compar);
    for(int i=1; i<=total; i++)
        M[ind[i]]=i;
    for(int i=1;i<=total;i++)
        if(nr[ind[i-1]].size()==nr[ind[i]].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;
}