Cod sursa(job #2632658)

Utilizator lucametehauDart Monkey lucametehau Data 4 iulie 2020 12:15:48
Problema Nums Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.68 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;
}