Cod sursa(job #811339)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 11 noiembrie 2012 22:25:48
Problema Nums Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>

using namespace std;
string s;
int m, x, arb[500010], sol, t[100010], n, q[100010], ind[100010], a[100010], p[100010], k;
bool used[100010];
string v[100010];
bool cmp(int a, int b)
{
    if(v[a].length() == v[b].length()) return v[a] < v[b];
    return v[a].length()< v[b].length();
}
void add(int nod, int l, int r)
{
    arb[nod]++;
    if(l == r) return;
    m = (l+r)/2;
    if(x <= m)
    {
        add(nod*2, l, m);
        arb[nod*2+1]++;
    }
    else add(nod*2+1, m+1, r);

}
void search(int nod, int l, int r)
{
    if(l == r)
    {
        sol = l;
        return;
    }
    m = (l+r)/2;
    if(arb[2*nod] >= x) search(nod*2, l, m);
    else
    {
        x -= arb[nod*2];
        search(nod*2+1, m+1, r);
    }
}
int main()
{
    int i, j;
    ifstream fi("nums.in");
    ofstream fo("nums.out");
    fi >> n;
    for(i = 1; i <= n; i++)
    {
        fi >> t[i];
        if(t[i] == 0) fi >> q[i]; else
        {
            fi >> s;
            v[++k] = s;
            ind[k] = k;
            p[k] = i;
        }
    }
    sort(ind+1, ind+k+1, cmp);
    v[0] = "";
    for(i = 1; i <= k; i++)
    {
        if(v[ind[i]]==v[ind[i-1]]) a[p[ind[i]]] = a[p[ind[i-1]]]; else
        a[p[ind[i]]] = i;
    }
    for(i = 1; i <= n; i++)
        if(t[i] == 0)
        {
            x = q[i];
            search(1, 1, k);
            j = 0;
            fo << v[ind[sol]] << "\n";
        }
        else
        {
            x = a[i];
            if(used[x]) continue;
            used[x] = 1;
            add(1, 1, k);
        }
    return 0;
}