Cod sursa(job #2633692)

Utilizator betybety bety bety Data 8 iulie 2020 11:47:47
Problema Nums Scor 95
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.85 kb


#include <iostream>

#include <algorithm>



using namespace std;



const int DIM = (1 << 23);



int n, m, k;

int bp;



string s;

int aib[100005], t[100005], a[100005], ind[100005], poz[100005];

pair <pair <int, string>, int> v[100005];

char buff[DIM];



void read(int &n) {

  n = 0;

  while(buff[bp] < '0' || '9' < buff[bp])

    bp++;

  while('0' <= buff[bp] && buff[bp] <= '9')

    n = n * 10 + buff[bp] - '0', bp++;

}



void readS(string &s) {

  s = "";

  while(buff[bp] < '0' || '9' < buff[bp])

    bp++;

  while('0' <= buff[bp] && buff[bp] <= '9')

    s += buff[bp], bp++;

}



int lsb(int n) {

  return n & -n;

}



void update(int ind, int val) {

  for(; ind <= k; ind += lsb(ind))

    aib[ind] += val;

}



int query(int ind) {

  int ans = 0;

  for(; ind; ind -= lsb(ind))

    ans += aib[ind];

  return ans;

}



int main() {

  freopen("nums.in", "r", stdin);

  freopen("nums.out", "w", stdout);

  fread(buff, 1, DIM, stdin); // hmmm

  read(n);

  for(int i = 1; i <= n; i++) {

    read(t[i]);

    if(t[i] == 0)

      read(a[i]);

    else {

      readS(s);

      //cout << s << "\n";

      v[++m] = {{s.size(), s}, i};

    }

  }

  sort(v + 1, v + m + 1);

  for(int i = 1; i <= m; i++) {

    if(v[i].first.second != v[i - 1].first.second)

      ind[v[i].second] = ++k, poz[k] = i;

  }

  for(int i = 1; i <= n; i++) {

    if(!t[i]) {

      int st = 1, dr = k, mid;

      while(st <= dr) {

        mid = (st + dr) >> 1;

        if(query(mid) >= a[i])

          dr = mid - 1;

        else

          st = mid + 1;

      }

      cout << v[poz[st]].first.second << "\n";

    } else {

      if(ind[i])

        update(ind[i], 1);

    }

  }

  return 0;

}