Cod sursa(job #1003400)

Utilizator DaNutZ2UuUUBB Bora Dan DaNutZ2UuU Data 30 septembrie 2013 17:06:37
Problema Nums Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <cstdio>
#include <string>
#include <algorithm>
#define MaxN 100100
 
using namespace std;
 
int n, nr, poz;
pair<string, int> words[MaxN];
int op[MaxN], val[MaxN], a[3*MaxN], ind[MaxN];
char lin[MaxN], used[MaxN];
 
bool comp(const pair<string, int> &x, const pair<string, int> &y){
    const string &a = x.first;
    const string &b = y.first;
    if (a.length() != b.length()) {
        return a.length() < b.length();
    }
    unsigned last = a.length() / sizeof(int), poz = 0;
    const int *s1 = (int *)a.c_str();
    const int *s2 = (int *)b.c_str();
    while (poz < last && s1[poz] == s2[poz]) {
       poz++;
    }
    unsigned k = 4 * poz;
    while (k + 1 < a.length() && a[k] == b[k])
        k++;
    return a[k] < b[k];
}
 
void baga(int p, int u, int r){
    a[r]++;
    if (p >= u)
        return;
    int mij = (p+u)/2;
    if (poz <= mij)
        baga(p, mij, 2*r);
    else
        baga(mij+1, u, 2*r+1);
}
 
int query(int p, int u, int r){
    if (p == u)
        return p;
    int mij = (p+u)/2;
    if (a[2*r] >= poz)
        return query(p, mij, 2*r);
    else    {
        poz -= a[2*r];
        return query(mij+1, u, 2*r+1);
    }
}
 
int main(){
    freopen("nums.in", "r", stdin);
    freopen("nums.out", "w", stdout);
    scanf("%d", &n);
    for (int i=0; i<n; i++){
        scanf("%d %s", op+i, lin);
        if (op[i] == 1)
            words[nr++] = make_pair(lin, i);
        else
            sscanf(lin, "%d", val+i);
    }
    sort(words, words+nr, comp);
    int k = 1;
    for (int i=0; i<nr; i++){
        val[words[i].second] = k;
        ind[k] = i;
        if (words[i].first != words[i+1].first)
            k++;
    }
    for (int i=0; i<n; i++)
        if (op[i] == 1){
            poz = val[i];
            if (used[poz])
                continue;
            used[poz] = true;
            baga(1, nr, 1);
        }   else    {
            poz = val[i];
            printf("%s\n", words[ind[query(1, nr, 1)]].first.c_str());
        }
    return 0;
}