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 "teams.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 500100;
vector <int> t, L, R;
int nleaf(int x){
    t.push_back(x);
    L.push_back(-1);
    R.push_back(-1);
    return t.size()-1;
}
int vcopy(int l, int r){
    t.push_back(t[l]+t[r]);
    L.push_back(l);
    R.push_back(r);
    return t.size()-1;
}
int build(int l = 0, int r = N-1){
    if (l == r)
        return nleaf(0);
    int mid = (l+r)>>1;
    return vcopy(build(l, mid), build(mid+1, r));
}
int rem(int v1, int v2, int x, int l = 0, int r = N-1){
    if (r <= x)
        return v2;
    if (l > x)
        return v1;
    int mid = (l+r)>>1;
    return vcopy(rem(L[v1], L[v2], x, l, mid), rem(R[v1], R[v2], x, mid+1, r));
}
int update(int v, int x, int l = 0, int r = N-1){
    if (l == r){
        return nleaf(t[v] + 1);
    }
    int mid = (l+r)>>1;
    if (x <= mid)
        return vcopy(update(L[v], x, l, mid), R[v]); else
        return vcopy(L[v], update(R[v], x, mid+1, r));
}
int update2(int v1, int v2, int x, int l = 0, int r = N-1){
    if (l == r){
        return nleaf(t[v1]+x);
    }
    int mid = (l+r)>>1;
    int kol = t[L[v2]]-t[L[v1]];
    if (kol >= x)
        return vcopy(update2(L[v1], L[v2], x, l, mid), R[v1]);
        return vcopy(L[v2], update2(R[v1], R[v2], x-kol, mid+1, r));
}
int n, root[N];
vector <int> g[N];
int empt;
void init(int N, int A[], int B[]) {
    n = N;
    root[0] = build();
    for (int i = 0; i < n; i++){
        g[A[i]].push_back(B[i]);
    }
    for (int i = 1; i <= n; i++){
        root[i] = rem(root[i-1], root[0], i-1);
        for (int j = 0; j < g[i].size(); j++){
            root[i] = update(root[i], g[i][j]);
        }
    }
    empt = build();
}
int can(int M, int K[]) {
    int cur = empt;
    sort(K, K+M);
    for (int i = 0; i < M; i++){
        cur = rem(cur, root[0], K[i]-1);
        if (t[root[K[i]]]-t[cur] < K[i])
            return 0;
        cur = update2(cur, root[K[i]], K[i]);
    }
    return 1;
}
Compilation message (stderr)
teams.cpp: In function 'int nleaf(int)':
teams.cpp:14:20: warning: conversion to 'int' from 'std::vector<int>::size_type {aka long unsigned int}' may alter its value [-Wconversion]
     return t.size()-1;
            ~~~~~~~~^~
teams.cpp: In function 'int vcopy(int, int)':
teams.cpp:21:20: warning: conversion to 'int' from 'std::vector<int>::size_type {aka long unsigned int}' may alter its value [-Wconversion]
     return t.size()-1;
            ~~~~~~~~^~
teams.cpp: In function 'int update2(int, int, int, int, int)':
teams.cpp:56:5: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
     if (kol >= x)
     ^~
teams.cpp:58:9: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
         return vcopy(L[v2], update2(R[v1], R[v2], x-kol, mid+1, r));
         ^~~~~~
teams.cpp: In function 'void init(int, int*, int*)':
teams.cpp:67:34: warning: declaration of 'N' shadows a global declaration [-Wshadow]
 void init(int N, int A[], int B[]) {
                                  ^
teams.cpp:6:11: note: shadowed declaration is here
 const int N = 500100;
           ^
teams.cpp:75:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (int j = 0; j < g[i].size(); j++){
                         ~~^~~~~~~~~~~~~| # | 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... |