Cod sursa(job #1669915)

Utilizator akaprosAna Kapros akapros Data 31 martie 2016 11:22:06
Problema Nums Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <bits/stdc++.h>
#define maxN 100002
#define zeros(x) x & (-x)
using namespace std;
int n, m, aib[maxN];
bool seen[maxN];
struct num
{
    string s;
    int x;
}V[maxN];
struct query
{
    bool ty;
    int x;
}v[maxN];
int cmp(const num a, const num b)
{
    if (a.s.size() == b.s.size())
        return a.s < b.s;
    return a.s.size() < b.s.size();
}
void add(int x)
{
    int i;
    for (i = x; i <= n; i += zeros(i))
        ++ aib[i];
}
int nthelem(int k)
{
    int i = 0, p = 1 << 16;
    while (p)
    {
        if (i + p <= n && aib[i + p] < k)
        {
            i += p;
            k -= aib[i];
        }
        p /= 2;
    }
    return i + 1;
}
void read()
{
    int i;
    ifstream fin("nums.in");
    fin >> n;
    for (i = 1; i <= n; ++ i)
    {
        fin >> v[i].ty;
        if (v[i].ty)
        {
            ++ m;
            fin >> V[m].s;
            V[m].x = i;
        }else
        fin >> v[i].x;
    }
}
void solve()
{
    /// normalize
    int i;
    sort(V + 1, V + m + 1, cmp);
    for (i = 1; i <= m; ++ i)
    {
        int j = i;
        while (V[i].s == V[j].s && j <= m)
        {
            v[V[j].x].x = i;
            ++ j;
        }
        i = j - 1;
    }
}
void write()
{
    int i;
    ofstream fout("nums.out");

    for (i = 1; i <= n; ++ i)
        if (v[i].ty)
    {
        if (!seen[v[i].x])
        {
            add(v[i].x);
            seen[v[i].x] = 1;
        }
    }else
    {
        int pos = nthelem(v[i].x);
        fout << V[pos].s << "\n";
    }
}
int main()
{
    read();
    solve();
    write();
    return 0;
}