Cod sursa(job #779790)

Utilizator tzipleatudTudor Tiplea tzipleatud Data 18 august 2012 19:29:58
Problema Nums Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <fstream>
#include <tr1/unordered_map>
#include <algorithm>
#include <vector>
#define NM 100010
#define t first
#define n second

using namespace std;

ifstream f("nums.in");
ofstream g("nums.out");

typedef pair<int, string> OP;
tr1::unordered_map<string, int> M;
vector<int> IND;
int N,i,j,P,AI[4*NM],K;
OP O[NM];
bool In[NM];

bool CompareString (const int& a, const int& b)
{
    return (O[a].n.size()!=O[b].n.size()?O[a].n.size()<O[b].n.size():O[a].n<O[b].n);
}

void Update (int nod, int S, int F)
{
    if (S>=F)
    {
        AI[nod]=1;
        return;
    }

    int M=(S+F)/2;
    if (P<=M)
        Update(2*nod,S,M);
    else
        Update(2*nod+1,M+1,F);

    AI[nod]=AI[2*nod]+AI[2*nod+1];
}

int Query (int nod, int S, int F)
{
    if (S>=F)
        return S;

    int M=(S+F)/2;
    if (K<=AI[2*nod])
        return Query(2*nod,S,M);
    else
    {
        K-=AI[2*nod];
        return Query(2*nod+1,M+1,F);
    }
    return 0;
}


int main ()
{
    f >> N;
    for (i=1; i<=N; i++)
    {
        f >> O[i].t >> O[i].n;
        if (O[i].t==1)
            IND.push_back(i);
    }

    sort(IND.begin(),IND.end(),CompareString);

    for (i=1; i<IND.size(); i++)
        M[O[IND[i]].n]=i+1;

    for (i=1; i<=N; i++)
        if (O[i].t==1)
        {
            P=M[O[i].n];
            if (In[P]) continue;
            Update(1,1,IND.size());
            In[P]=1;
        }
        else
        {
            K=0;
            for (j=0; j<O[i].n.size(); j++)
                K=K*10+O[i].n[j]-'0';
            P=Query(1,1,IND.size());
            g << O[IND[P-1]].n << '\n';
        }

    f.close();
    g.close();
    return 0;
}