Cod sursa(job #811316)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 11 noiembrie 2012 21:50:44
Problema Nums Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>

using namespace std;
string s;
int m, x, arb[600010], L, sol, t[100010], n, q[100010], ind[100010], a[100010], p[100010], k;
string v[100010];
bool cmp(int a, int b)
{
    return v[a] < v[b];
}
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;
            if(s.length() > L) L = s.length();
            v[++k] = s;
            ind[k] = k;
            p[k] = i;
        }
    }
    for(i = 1; i <= k; i++)
    while(v[i].length() < L) v[i] = "0" + v[i];
    sort(ind+1, ind+k+1, cmp);
    for(i = 1; i <= k; i++) a[p[ind[i]]] = i;
    for(i = 1; i <= n; i++)
        if(t[i] == 0)
        {
            x = q[i];
            search(1, 1, k);
            j = 0;
            while(v[ind[sol]][j] == '0') j++;
            for(; j < v[ind[sol]].length(); j++)
            fo << v[ind[sol]][j];
            fo << "\n";
        }
        else
        {
            x = a[i];
            add(1, 1, k);
        }
    return 0;
}