#include <iostream>
#include <vector>
#include <queue>
#include <utility>
#include <algorithm>
#include <random>
#include <map>
#include "teams.h"
const int BLK_SIZE = 300;
int x;
std::vector<std::pair<int,int>> segments;
std::vector<int> tree[500005];
int fnwk[500005];
void tree_insert(int pos, int val) {
	while (pos <= x) {
		tree[pos].emplace_back(val);
		pos += pos&-pos;
	}
}
void tree_sort() {
	for (int i = 1; i <= x; i++) {
		std::sort(tree[i].begin(),tree[i].end());
	}
}
int tree_query(int pos, int l, int r) {
	int ret = 0;
	while (pos > 0) {
		ret += std::upper_bound(tree[pos].begin(),tree[pos].end(),r) - std::lower_bound(tree[pos].begin(),tree[pos].end(),l);
		pos ^= pos&-pos;
	}
	return ret;
}
void fnwk_add(int pos, int val) {
	while (pos <= x) {
		fnwk[pos] += val;
		pos += pos&-pos;
	}
}
int fnwk_query(int pos) {
	int ret = 0;
	while (pos > 0) {
		ret += fnwk[pos];
		pos ^= pos&-pos;
	}
	return ret;
}
void init(int N, int A[], int B[]) {
	x = N;
	for (int i = 0; i < x; i++) {
		tree_insert(A[i],B[i]);
		segments.emplace_back(A[i], B[i]);
	}
	std::sort(segments.begin(),segments.end(),[](const std::pair<int,int>& a, const std::pair<int,int>& b) {
		return a.first < b.first;
	});
	tree_sort();
}
int can(int qsz, int qarr[]) {
	std::sort(qarr,qarr+qsz);
	if (qsz > BLK_SIZE || x <= BLK_SIZE) {
		std::priority_queue<int, std::vector<int>, std::greater<int>> pq;
		int scanline = 0;
		for (int i = 0; i < qsz; i++) {
			while (scanline < segments.size() && segments[scanline].first <= qarr[i]) {
				pq.emplace(segments[scanline].second);
				++scanline;
			}
			while (!pq.empty()&&pq.top()<qarr[i]) {
				pq.pop();
			}
			int count = 0;
			while (!pq.empty()&&count<qarr[i]) {
				++count;
				pq.pop();
			}
			if (count != qarr[i]) {
				return 0;
			}
		}
		return 1;
	}
	else {
		std::map<int,int> freq;
		std::vector<int> distinct;
		for (int i = 0; i < qsz; i++) {
			++freq[qarr[i]];
			if (i+1<qsz&&qarr[i]==qarr[i+1]) {
				continue;
			}
			distinct.emplace_back(qarr[i]);
		}
		std::vector<std::pair<int,int>> updates;
		int ret = 1;
		for (int i = 0; i < distinct.size(); i++) {
			int target = 1LL * freq[distinct[i]] * distinct[i];
			for (int j = i; j < distinct.size() && target > 0; j++) {
				int ri = ((j+1<distinct.size()) ? distinct[j+1]-1 : x);
				int add = std::min(target, tree_query(distinct[i],distinct[i],ri) - fnwk_query(ri) + fnwk_query(distinct[i]-1));
				target -= add;
				updates.emplace_back(ri,-add);
				fnwk_add(ri,-add);
			}
			if (target != 0) {
				//std::cout << i << "\n";
				ret = 0;
				break;
			}
		}
		for (const auto& [a, b] : updates) {
			fnwk_add(a,-b);
		}
		return ret;
	}
}
| # | 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... |