Cod sursa(job #1737345)

Utilizator tudi98Cozma Tudor tudi98 Data 3 august 2016 20:12:10
Problema Nums Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <bits/stdc++.h>
using namespace std;

bool comp(pair<string,int> a, pair<string,int> b)
{
    if (a.first.size() == b.first.size())
        return a.first < b.first;
    return a.first.size() < b.first.size();
}

bool eq(pair<string,int> a, pair<string,int> b)
{
    if (a.first.size() == b.first.size())
        return a.first == b.first;
    return 0;
}

int N,M;
int data[100001];
int do_at[100001];
int _norm[100001];
string snorm[100001];
vector< pair<string,int> > b;

void Add(int pos)
{
    for (int i = pos; i <= M; i += i&-i)
        data[i]++;
}

int kth_elem(int k)
{
    int step,i;
    for (step = 1; (step<<1) <= M; step <<= 1);
    for (i = 0; step; step >>= 1)
        if (step + i <= M && data[step+i] <= k)
            i += step, k -= data[i];
    return i;
}

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

    fin >> N;
    for (int i = 1; i <= N; i++)
    {
        int t;
        fin >> t;
        if (t == 0)   // query
        {
            int x;
            fin >> x;
            do_at[i] = x;
        }
        else         // update
        {
            do_at[i] = -1;
            string s;
            fin >> s;
            b.push_back(make_pair(s,i));
        }
    }

    stable_sort(b.begin(),b.end(),comp);
    M = unique(b.begin(),b.end(),eq) - b.begin();

    for (int i = 0; i < M; i++)
    {
        _norm[b[i].second] = i + 1;
        do_at[b[i].second] = -2;
        snorm[i+1] = b[i].first;
    }

    for (int i = 1; i <= N; i++)
    {
        if (do_at[i] == -1) continue;
        if (do_at[i] > 0)  // query
        {
            fout << snorm[kth_elem(do_at[i])] << "\n";
        }
        else       // update
        {
            Add(_norm[i]);
        }
    }

}