Cod sursa(job #1474449)

Utilizator vladrochianVlad Rochian vladrochian Data 22 august 2015 00:04:41
Problema Nums Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

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

struct Num {
  string str;
  int order, indx;
};

int N;
vector<Num> v;
vector<pair<int, int>> q;
vector<int> aib, ans;

void Add(int p) {
  for (int i = p; i <= N; i += i & -i)
    ++aib[i];
}

int Search(int k) {
  int ans = 0;
  for (int step = 1 << 17; step; step >>= 1)
    if ((ans ^ step) <= N && aib[ans ^ step] < k)
      k -= aib[ans ^= step];
  return ans;
}

int main() {
  fin >> N;
  q.resize(N);

  for (auto &it : q) {
    fin >> it.first;
    if (it.first == 0) {
      fin >> it.second;
    } else {
      it.second = v.size();
      v.push_back(Num());
      fin >> v.back().str;
      v.back().indx = it.second;
    }
  }
  N = v.size();

  sort(v.begin(), v.end(), [&](const Num &lhs, const Num &rhs) {
         if (lhs.str.size() == rhs.str.size())
           return lhs.str < rhs.str;
         return lhs.str.size() < rhs.str.size();
       });

  for (int i = 0; i < int(v.size()); ++i)
    v[i].order = i;

  sort(v.begin(), v.end(), [&](const Num &lhs, const Num &rhs) {
         return lhs.indx < rhs.indx;
       });

  aib.resize(N + 1);
  for (const auto &it : q)
    if (it.first == 0)
      ans.push_back(Search(it.second));
    else
      Add(v[it.second].order + 1);

  sort(v.begin(), v.end(), [&](const Num &lhs, const Num &rhs) {
         return lhs.order < rhs.order;
       });

  for (int i : ans)
    fout << v[i].str << "\n";
  return 0;
}