Cod sursa(job #2020540)

Utilizator cristina_borzaCristina Borza cristina_borza Data 10 septembrie 2017 17:28:08
Problema Nums Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <algorithm>
#include <iostream>
#include <fstream>
#include <cstring>
#include <map>

using namespace std;

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

const int Dim = 1e5 + 5;

int aib[ Dim ], c[ Dim ];
int n, nr, m, type;

string s;

map <string, bool> mp;

struct str1 {
    int val, nr;
} q[ Dim ];

struct str {
    int pos;
    string s;
} v[ Dim ];

bool cmp (str a, str b) {
    return a.s.size() < b.s.size () || (a.s.size() == b.s.size() && a.s < b.s);
}

int query (int pos) {
    int ans = 0;
    while (pos >= 1) {
        ans += aib[pos];
        pos -= pos & (pos ^ (pos - 1));
    }

    return ans;
}

void update (int pos, int val) {
    while (pos <= n) {
        aib[pos] += val;
        pos += pos & (pos ^ (pos - 1));
    }
}

int cbin (int val) {
    int i, p = 0;
    for (i = 1; i <= n; i <<= 1);

    while (i) {
        if (i + p <= n && query (i + p) < val) {
            p += i;
        }

        i >>= 1;
    }

    return p + 1;
}

int main() {
    f >> n;
    for (int i = 1; i <= n; ++i) {
        f >> type;
        if (type == 1) {
            f >> s;
            if (mp[s] == 1)
                continue;

            mp[s] = 1;
            ++nr;

            v[nr].s = s;
            v[nr].pos = nr;
        }

        else {
            f >> q[++m].val;
            q[m].nr = nr;
        }
    }

    sort (v + 1, v + nr + 1, cmp);
    /*for (int i = 1; i <= nr; ++i) {
        cout << v[i].pos << " " << v[i].s << '\n';
    }*/
    for (int i = 1; i <= nr; ++i) {
        c[v[i].pos] = i;
    }

    int p = 1;
    for (int i = 1; i <= m; ++i) {
        while (p <= nr && p <= q[i].nr) {
            update (c[p], 1);
            ++p;
        }

        g << v[cbin (q[i].val)].s << '\n';
    }
    return 0;
}