Cod sursa(job #1473958)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 20 august 2015 16:11:42
Problema Nums Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 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;

int n , i , STEP , limit;
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].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 = v.size() - 1; i >= 0; --i)
    {
        //cout << v[i].F << '\n';
        ord[v[i].S] = (i < v.size() - 1 && v[i].F == v[i+1].F) ? ord[v[i+1].S] : (i + 1);
    }
    limit = v.size();

    for (STEP = 1; STEP < limit; 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;
}