Cod sursa(job #1473954)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 20 august 2015 16:03:04
Problema Nums Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <bits/stdc++.h>

#define F first
#define S second

#define last_bit(x) (x&(-x))

using namespace std;

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

const int Nmax = 100010;
const int Limit = 100000;

int n , i , STEP;
int aib[Nmax] , ord[Nmax];

bool tip[Nmax] , marked[Nmax];

vector < int > q;
vector < pair < string , int > > v;

void aibUpdate(int i)
{
    for ( ; i <= Limit; i += last_bit(i))
        aib[i]++;
}

int aibQuery(int i)
{
    int ret = 0;
    for ( ; i ; i -= last_bit(i))
        ret += aib[i];

    return ret;
}

void search_(int pos)
{
    int i , step = STEP;

    for (i = 0; step; step >>= 1)
        if (i + step <= Limit && aibQuery(i + step) <= pos)
            i += step;

    fout << v[i-1].F << '\n';
}

bool mode(pair < string , int > a , pair < string , int > b)
{
    if (a.F.size() == b.F.size())
        return (a.F < b.F);
    else
        return (a.F.size() < b.F.size());
}

int main()
{
    fin >> n;

    for (i = 1; i <= n; ++i)
    {
        fin >> tip[i];

        if (tip[i] == 1)
        {
            string sir; fin >> sir;
            v.push_back( { sir , i } );
        }
        else
        {
            int x; fin >> x;
            q.push_back(x);
        }
    }

    sort(v.begin() , v.end() , mode);
    for (i = 0; i < v.size(); ++i)
    {
        //cout << v[i].F << '\n';
        ord[v[i].S] = (i > 0 && v[i].F == v[i-1].F) ? ord[v[i-1].S] : (i + 1);
    }

    for (STEP = 1; STEP < n; STEP <<= 1);

    auto it = q.begin();
    for (i = 1; i <= n; ++i)
        if (tip[i] && !marked[ord[i]])
        {
            aibUpdate(ord[i]);
            marked[ord[i]] = 1;
        }
        else if (!tip[i]) search_(*it++);

    return 0;
}