Cod sursa(job #319373)

Utilizator DastasIonescu Vlad Dastas Data 31 mai 2009 17:02:18
Problema Nums Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.64 kb
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
#include <sstream>

using namespace std;

const int maxn = 100001;

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

struct info
{
    char nr[maxn];
    int poz;
};

int compare(const char x[], const char y[])
{
    int t = strlen(x);
    int p = strlen(y);

    if ( t < p ) return 1;
    else if ( t > p ) return 0;
    else
    {
        for ( int i = 0; i < t; ++i )
            if ( x[i] < y[i] )
                return 1;
            else if ( x[i] > y[i] )
                return 0;
    }

    return -110;
}

bool operator <(const info &x, const info &y)
{
    int t = compare(x.nr, y.nr);
    if ( t == -110 )
        return x.poz < y.poz;
    else
        return t;
}

int n, k;
int poz_in_sorted[maxn];
int dupp[maxn];
char all[maxn]; // toate datele de intrare
vector <info> numbers; // numai numerele
int queries[maxn];

string temp[maxn];

int arb[1 << 18];

void read()
{
    in >> n;

    info tmp;

    numbers.push_back(tmp);

    for ( int i = 1; i <= n; ++i )
    {
        in >> tmp.poz;
        all[i] = tmp.poz;
        if ( tmp.poz == 0 )
            in >> queries[i];
        else if ( tmp.poz == 1 )
        {
            in >> tmp.nr;
            tmp.poz = ++k;
            numbers.push_back(tmp);
        }
    }

    in.close();

    std::sort(numbers.begin()+1, numbers.end());

    poz_in_sorted[ numbers[1].poz ] = 1;
    for ( int i = 2; i <= k; ++i )
    {
        if ( !strcmp(numbers[i].nr, numbers[i-1].nr) )
            dupp[ numbers[i].poz ] = 1;

        poz_in_sorted[ numbers[i].poz ] = i;
    }
}

void update(int nod, int st, int dr, int &what)
{
    if ( what < st || what > dr ) return;

    if ( st == dr )
    {
        ++arb[nod];

        return;
    }

    int q = nod << 1;
    int mij = (st + dr) >> 1;

    update(q, st, mij, what);
    update(q + 1, mij+1, dr, what);

    arb[nod] = arb[q] + arb[q + 1];
}

int query(int nod, int st, int dr, int poz)
{
    if ( st == dr )
        return st;

    int q = nod << 1;
    int mij = (st + dr) >> 1;

    if ( arb[q] < poz )  return query(q + 1, mij+1, dr, poz - arb[q]);
    else                 return query(q, st, mij, poz);
}

int main()
{
    read();

    int p = 0;
    for ( int i = 1; i <= n; ++i )
    {
        if ( all[i] == 1 )
        {
            ++p;
            if ( !dupp[p] )
                update(1, 1, k, poz_in_sorted[p]);
        }
        else
            out << numbers[query(1, 1, k, queries[i])].nr << endl;
    }

    return 0;
}