Cod sursa(job #3352932)

Utilizator EricDimiCismaru Eric-Dimitrie EricDimi Data 2 mai 2026 15:16:55
Problema Nums Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.12 kb
#include <fstream>
#include <cstdint>
#include <string>
#include <map>

using namespace std;

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

const int_fast32_t NMAX = 100000;

struct BigNum
{
    string val;
    bool operator < (const BigNum& x) const
    {
        if(val.size() != x.val.size())
            return val.size() < x.val.size();
        return val < x.val;
    }
};

map<BigNum, int_fast32_t> M;
BigNum vec[NMAX + 1];
int_fast32_t freq[NMAX + 1];
int_fast32_t n, m;

struct Query
{
    bool t;
    BigNum num;
    int_fast32_t k;
};
Query queries[NMAX + 1];

class SegmentTree
{
private:
    int_fast32_t tree[NMAX << 2 | 1];
    void Update(int_fast32_t nod, int_fast32_t st, int_fast32_t dr, int_fast32_t pos, int_fast32_t x)
    {
        if(st == dr)
        {
            tree[nod] = x;
            return;
        }
        int_fast32_t mid = st + ((dr - st) >> 1);
        if(pos <= mid)
            Update(nod << 1, st, mid, pos, x);
        else
            Update(nod << 1 | 1, mid + 1, dr, pos, x);
        tree[nod] = tree[nod << 1] + tree[nod << 1 | 1];
    }
    int_fast32_t Query(int_fast32_t nod, int_fast32_t st, int_fast32_t dr, int_fast32_t qst, int_fast32_t qdr)
    {
        if(qdr < st || dr < qst)
            return 0;
        if(qst <= st && dr <= qdr)
            return tree[nod];
        int_fast32_t mid = st + ((dr - st) >> 1);
        return Query(nod << 1, st, mid, qst, qdr) +
               Query(nod << 1 | 1, mid + 1, dr, qst, qdr);
    }
    int_fast32_t Walk(int_fast32_t nod, int_fast32_t st, int_fast32_t dr, int_fast32_t k, int_fast32_t pref)
    {
        if(st == dr)
            return st;
        int_fast32_t mid = st + ((dr - st) >> 1),
            sum = pref + tree[nod << 1];
        if(sum >= k)
            return Walk(nod << 1, st, mid, k, pref);
        return Walk(nod << 1 | 1, mid + 1, dr, k, sum);
    }
public:
    void Update(int_fast32_t pos, int_fast32_t x) { Update(1, 1, m, pos, x); }
    int_fast32_t Query(int_fast32_t qst, int_fast32_t qdr) { return Query(1, 1, m, qst, qdr); }
    int_fast32_t Walk(int_fast32_t k) { return Walk(1, 1, m, k, 0); }
};
SegmentTree segtree;

void ReadNums()
{
    f >> n;
    for(int_fast32_t i = 1; i <= n; i++)
    {
        f >> queries[i].t;
        if(queries[i].t == 0)
            f >> queries[i].k;
        else
        {
            f >> queries[i].num.val;
            M[queries[i].num] = 1;
        }
    }
}

void CoordCompress()
{
    m = 0;
    for(auto& [num, val] : M)
    {
        vec[++m] = num;
        val = m;
    }
}

void AnswerQueries()
{
    for(int_fast32_t i = 1; i <= n; i++)
    {
        if(queries[i].t == 0)
            g << vec[segtree.Walk(queries[i].k)].val << '\n';
        else
        {
            int_fast32_t idx = M[queries[i].num];
            if(freq[idx] == 0)
            {
                freq[idx] = 1;
                segtree.Update(idx, 1);
            }
        }
    }
}

int main()
{
    ReadNums();
    CoordCompress();
    AnswerQueries();
    f.close();
    g.close();
    return 0;
}