Cod sursa(job #767561)

Utilizator FcBarcelonaFC Barcelona FcBarcelona Data 13 iulie 2012 20:03:44
Problema Nums Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include<fstream>
#include<algorithm>
#include<tr1/unordered_map>
#include<string>
#include<vector>
using namespace std;
using namespace tr1;

#define f first
#define s second

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

const int N = 100100;

int n, aib[N], l;
bool ver[N];
pair<int, string> op[N];
unordered_map<string, int> h;
vector<int> norm;

inline int cmp(const int &a, const int &b) {
    if(op[a].s.size() == op[b].s.size())
        return op[a].s < op[b].s;
    return op[a].s.size() < op[b].s.size();
}

inline void update(int poz) {
    for(; poz<=l; poz += poz&(-poz))
        aib[poz] += 1;
}

inline int co(const string &a) {
    int i, r = 0;

    for(i = 0; i!=a.size(); ++i)
        r = (r * 10) + a[i] - '0';
    return r;
}

inline int search(int nr) {
    int i, pas = 1<<17;

    for(i = 0; pas; pas>>=1)
        if(i + pas <= l && nr > aib[i + pas]) {

            i += pas;
            nr -= aib[i];
        }
    return i;
}

int main() {
    int i;

    in >> n;

    for(i = 1; i<=n; ++i) {
        in >> op[i].f >> op[i].s;

        if(op[i].f)
            norm.push_back(i);
    }

    l = norm.size();
    sort(norm.begin(), norm.end(), cmp);

    for(i = 0; i!=norm.size(); ++i)
        h[op[norm[i]].s] = i + 1;

    for(i = 1; i<=n; ++i) {
        if(op[i].f) {

            int t = h[op[i].s];
            if(!ver[t]) {
                ver[t] = true;
                update(t);
            }
        }
        else {

            out << op[norm[search(co(op[i].s))]].s << "\n";
        }
    }

	return 0;
}