Cod sursa(job #2061759)

Utilizator cipri321Marin Ciprian cipri321 Data 9 noiembrie 2017 17:58:17
Problema Nums Scor 55
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <fstream>
#include <string>
#include <map>
#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];
string QS[DIM];
map<string,int> M;
string C[DIM];
int F[DIM];
int AIB[DIM];
bool compar(string a,string b)
{
    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 C[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>>QS[i];
            Q[i]=1;
            UP[++nru]=QS[i];
        }
    }
    sort(UP+1,UP+nru+1,compar);
    for(int i=1;i<=nru;i++)
    {
        M[UP[i]]=i;
        C[i]=UP[i];
    }
    for(int i=1;i<=n;i++)
    {
        if(Q[i]&&!F[M[QS[i]]])
        {
            update(M[QS[i]]);
            F[M[QS[i]]]=1;
        }
        else
            fo<<query(QQ[i])<<"\n";
    }
    fi.close();
    fo.close();
    return 0;
}