Cod sursa(job #793981)

Utilizator visanrVisan Radu visanr Data 4 octombrie 2012 21:40:00
Problema Nums Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <fstream>
#include <tr1/unordered_map>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

#define leftSon (node << 1)
#define rightSon ((node << 1) + 1)
#define PIS pair<int, string>
#define nmax 100010
#define t first
#define n second

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

tr1 :: unordered_map<string, int> M;
vector<int> ind;
int N, P, K, Aint[4 * nmax];
PIS now[nmax];
bool In[nmax];

bool cmp(int i, int j)
{
    if(now[i].n.size() != now[j].n.size())
        return now[i].n.size() < now[j].n.size();
    return now[i].n < now[j].n;
}

void Update(int node, int left, int right)
{
    if(left == right)
    {
        Aint[node] = 1;
        return ;
    }
    int mid = (left + right) / 2;
    if(P <= mid) Update(leftSon, left, mid);
    else Update(rightSon, mid + 1, right);
    Aint[node] = Aint[leftSon] + Aint[rightSon];
}

int Query(int node, int left, int right)
{
    if(left >= right) return left;
    int mid = (left + right) / 2;
    if(K <= Aint[leftSon]) return Query(leftSon, left, mid);
    else
    {
        K -= Aint[leftSon];
        return Query(rightSon, mid + 1, right);
    }
    return 0;
}

int main()
{
    int i, j;
    in >> N;
    for(i = 1; i <= N; i++)
    {
        in >> now[i].t >> now[i].n;
        if(now[i].t == 1) ind.push_back(i);
    }
    sort(ind.begin(), ind.end(), cmp);
    for(i = 1; i < ind.size(); i++)
        M[now[ind[i]].n] = i + 1;
    for(i = 1; i <= N; i++)
    {
        if(now[i].t == 1)
        {
            P = M[now[i].n];
            if(In[P]) continue;
            Update(1, 1, ind.size());
            In[P] = 1;
        }else
        {
            K = 0;
            for(j = 0; j < now[i].n.size(); j++)
                K = K * 10 + now[i].n[j] - '0';
            P = Query(1, 1, ind.size());
            out << now[ind[P - 1]].n << "\n";
        }
    }
    return 0;
}