Cod sursa(job #319329)

Utilizator DastasIonescu Vlad Dastas Data 31 mai 2009 15:27:34
Problema Nums Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.28 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
{
    string nr;
    int poz;
};

bool compare(const string &x, const string &y)
{
    if ( x.size() < y.size() ) return 1;
    else if ( x.size() > y.size() ) return 0;
    else
    {
        for ( unsigned int i = 0; i < x.size(); ++i )
            if ( x[i] < y[i] )
                return 1;
            else if ( x[i] > y[i] )
                return 0;
    }

    return 0;
}

bool operator <(const info &x, const info &y)
{
    return compare(x.nr, y.nr);
}

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

int arb[1 << 18];

void read()
{
    in >> n;

    info tmp;

    all.push_back(tmp);
    numbers.push_back(tmp);

    for ( int i = 1; i <= n; ++i )
    {
        in >> tmp.poz >> tmp.nr;

        all.push_back(tmp);

        if ( tmp.poz == 1 )
        {
            tmp.poz = ++k;
            numbers.push_back(tmp);
        }
    }

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

#define left (2*nod)
#define right (left+1)
#define mij ((st + dr) / 2)

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

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

        return;
    }

    update(left, st, mij, what);
    update(right, mij+1, dr, what);

    arb[nod] = arb[left] + arb[right];
}

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

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

int main()
{
    read();

    for ( int i = 1; i <= k; ++i )
        poz_in_sorted[ numbers[i].poz ] = i;

    int x;
    int p = 0;
    for ( int i = 1; i <= n; ++i )
    {
        if ( all[i].poz == 1 )
            update(1, 1, k, poz_in_sorted[++p]);
        else
        {
            istringstream t(all[i].nr);
            t >> x;

            out << numbers[query(1, 1, k, x)].nr << endl;
        }
    }

    return 0;
}