This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#include "teams.h"
using namespace std;
class node {
 public:
  node* l;
  node* r;
  int s;
};
vector<node*> roots;
node* null;
int n;
void init_null() {
  null = new node();
  null->l = null->r = null;
  null->s = 0;
}
node* insert(node* u, int l, int r, int p) {
  node* v = new node();
  v->l = u->l;
  v->r = u->r;
  v->s = u->s + 1;
  if (l != r) {
    int y = (l + r) >> 1;
    if (p <= y) {
      v->l = insert(v->l, l, y, p);
    } else {
      v->r = insert(v->r, y + 1, r, p);
    }
  }
  return v;
}
int query(node* v, int l, int r, int p) {
  if (l == r) {
    return v->s;
  } else {
    int y = (l + r) >> 1;
    if (p <= y) {
      return query(v->l, l, y, p) + v->r->s;
    } else {
      return query(v->r, y + 1, r, p);
    }
  }
}
int kth(node* v, node* u, int l, int r, int k) {
  if (l == r) {
    return r;
  } else {
    int y = (l + r) >> 1;
    if (k > v->r->s - u->r->s) {
      return kth(v->l, u->l, l, y, k - (v->r->s - u->r->s));
    } else {
      return kth(v->r, u->r, y + 1, r, k);
    }
  }
}
void init(int N, int A[], int B[]) {
  n = N;
  init_null();
  vector<vector<int>> events(n + 1);
  for (int i = 0; i < n; ++i) {
    events[A[i]].push_back(B[i]);
  }
  roots.assign(n + 1, null);
  for (int i = 1; i <= n; ++i) {
    roots[i] = roots[i - 1];
    for (auto j : events[i]) {
      roots[i] = insert(roots[i], 1, n, j);
    }
  }
}
int can(int M, int K[]) {
  sort(K, K + M);
  vector<int> height(1, n);
  vector<int> pos(1, 0);
  vector<int> sum(1, 0);
  for (int i = 0; i < M; ++i) {
    while (height.back() < K[i]) {
      height.pop_back();
      pos.pop_back();
      sum.pop_back();
    }
    int cnt = query(roots[K[i]], 1, n, K[i]) + (sum.back() - query(roots[pos.back()], 1, n, K[i]));
    if (cnt < K[i]) {
      return 0;
    }
    cnt -= K[i];
    while (true) {
      int h = kth(roots[K[i]], roots[pos.back()], 1, n, cnt - sum.back());
      if (h > height.back()) {
        height.pop_back();
        pos.pop_back();
        sum.pop_back();
      } else {
        height.push_back(h);
        pos.push_back(K[i]);
        sum.push_back(cnt);
        break;
      }
    }
  }
  return 1;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |