#include "teams.h"
#include<bits/stdc++.h>
using namespace std;
int n;
struct node {
	node *lc, *rc;
	int val, tl, tr;
	bool nl, nr;
	node(node* lcc, node* rcc, int v, int tll, int trr){
		lc = lcc;
		rc = rcc;
		val = v;
		tl = tll;
		tr = trr;
		nl = false;
		nr = false;
	}
};
vector<node*> roots;
void build(node* cur){
	if (cur->tl == cur->tr) return;
	int tm = (cur->tl+cur->tr)/2;
	cur->lc = new node(nullptr, nullptr, 0, cur->tl, tm);
	cur->rc = new node(nullptr, nullptr, 0, tm+1, cur->tr);
	build(cur->lc);
	build(cur->rc);
}
void update(node* cur, int pos){
	if (cur->tl == cur->tr){
		cur->val++;
		return;
	}
	int tm = (cur->tl+cur->tr)/2;
	if (pos <= tm){
		if (!cur->nl){
			cur->lc = new node(cur->lc->lc, cur->lc->rc, cur->lc->val, cur->lc->tl, cur->lc->tr);
			cur->nl = true;
		}
		update(cur->lc, pos);
	}
	else {
		if (!cur->nr){
			cur->rc = new node(cur->rc->lc, cur->rc->rc, cur->rc->val, cur->rc->tl, cur->rc->tr);
			cur->nr = true;
		}
		update(cur->rc, pos);
	}
	cur->val = cur->lc->val+cur->rc->val;
}
int query(node* cur, int l, int r){
	if (l > r) return 0;
	if (r < cur->tl || cur->tr < l) return 0;
	if (l <= cur->tl && cur->tr <= r) return cur->val;
	int tm = (cur->tl+cur->tr)/2;
	int res = 0;
	if (l <= tm) res += query(cur->lc, l, r);
	if (tm+1 <= r) res += query(cur->rc, l, r);
	return res;
}
void init(int N, int A[], int B[]){
	n = N;
	roots.push_back(new node(nullptr, nullptr, 0, 1, N));
	build(roots.back());
	vector<vector<int>> ev(N+1);
	for (int i=0; i<N; i++) ev[A[i]].push_back(B[i]);
	for (int i=1; i<=N; i++){
		roots.push_back(new node(roots.back()->lc, roots.back()->rc, roots.back()->val, roots.back()->tl, roots.back()->tr));
		for (int x : ev[i]) update(roots.back(), x);
	}
	/*for (int i=1; i<=N; i++){
		for (int j=i; j<=N; j++) cout << query(roots[i], j, N) << " ";
		cout << endl;
	}*/
}
int can(int M, int K[]){
	sort(K, K+M);
	vector<int> ch;
	for (int i=0; i<M; i++){
		if (i == M-1 || K[i] != K[i+1]) ch.push_back(K[i]);
	}
	int q = ch.size();
	ch.push_back(n+1);
	vector<int> occ(q, 0);
	//cout << endl;
	for (int i=0; i<M; i++){
		//cout << K[i] << endl;
		int req = K[i];
		for (int j=0; j<q; j++){
			if (ch[j] < K[i]) continue;
			int rem = query(roots[K[i]], ch[j], ch[j+1]-1)-occ[j];
			//cout << rem << endl;
			if (rem > req){
				occ[j] += req;
				req = 0;
			}
			else {
				req -= rem;
				occ[j] += rem;
			}
			if (!req) break;
		}
		//cout << req << endl;
		if (req) return false;
	}
	return true;
}
| # | 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... |