Cod sursa(job #2166448)

Utilizator DavidLDavid Lauran DavidL Data 13 martie 2018 17:09:49
Problema Nums Scor 65
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
/// copiata; test
#include <fstream>
#include <string>
#include <algorithm>
#define DIM 100001
using namespace std;
ifstream fi("nums.in");
ofstream fo("nums.out");
int n,nru;
string UP[DIM];
int Q[DIM];
int QQ[DIM],QS[DIM];
int F[DIM];
int AIB[DIM],MAP[DIM],IND[DIM];
bool compar(int x,int y)
{
    string a=UP[x],b=UP[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))
        AIB[i]++;
}
string query(int k)
{
    int step,pos=0;
    step=65536;
    for(; step; step>>=1)
        if(pos+step<=nru)
            if(AIB[pos+step]<k)
            {
                pos+=step;
                k-=AIB[pos];
            }

    return UP[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>>UP[++nru];
            Q[i]=1;
            QS[i]=nru;
            IND[nru]=nru;
        }
    }
    sort(IND+1,IND+nru+1,compar);
    for(int i=1; i<=nru; i++)
        MAP[IND[i]]=i;
    for(int i=1;i<=nru;i++)
        if(UP[IND[i-1]].size()==UP[IND[i]].size()&& UP[IND[i]]==UP[IND[i-1]])
            MAP[IND[i]]=MAP[IND[i-1]];
    for(int i=1;i<=n;i++)
    {
        if(Q[i]&&!F[MAP[QS[i]]])
        {
            update(MAP[QS[i]]);
            F[MAP[QS[i]]]=1;
        }
        else if(Q[i]==0)
            fo<<query(QQ[i])<<"\n";
    }
    fi.close();
    fo.close();
    return 0;
}