#include "teams.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define fi first
#define se second
#define pb push_back
#define vi vector<int>
#define vl vector<ll>
#define pi pair<int, int>
#define pl pair<ll,ll>
#define all(x) (x).begin(),(x).end()
struct node {
	int sum=0;
	node(int _sum=0): sum(_sum){}
};
vector<node> nodes(1);
vi roots={0};
vi l(1,-1),r(1,-1);
int n;
vi a;
int getnode(int s=0) {
	nodes.pb(node(s));
	l.pb(-1);
	r.pb(-1);
	return nodes.size()-1;
}
void build(int v, int tl, int tr) {
	if (tl==tr) {
		return;
	}
	int tm=tl+(tr-tl)/2;
	l[v]=getnode();
	r[v]=getnode();
	build(l[v],tl,tm);
	build(r[v],tm+1,tr);
}
void update(int ov, int nv, int tl, int tr, int ind) {
	nodes[nv].sum=nodes[ov].sum+1;
	if (tl==tr) {
		return;
	}
	int tm=tl+(tr-tl)/2;
	if (ind<=tm) {
		l[nv]=getnode();
		r[nv]=r[ov];
		update(l[ov],l[nv],tl,tm,ind);
	}
	else {
		l[nv]=l[ov];
		r[nv]=getnode();
		update(r[ov],r[nv],tm+1,tr,ind);
	}
}
int get(int v, int tl, int tr, int lb, int rb) {
	if (lb<=tl && tr<=rb) {
		return nodes[v].sum;
	}
	if (tr<lb || rb<tl) {
		return 0;
	}
	int tm=tl+(tr-tl)/2;
	return get(l[v],tl,tm,lb,rb)+get(r[v],tm+1,tr,lb,rb);
}
int get(int la, int ra, int lb) {
	int l=lower_bound(all(a),la)-a.begin();
	int r=upper_bound(all(a),ra)-a.begin();
	return get(roots[r],0,n,lb,n)-get(roots[l],0,n,lb,n);
}
int findind(int v1, int v2, int lim, int tl, int tr) {
	if (tl==tr) {
		if (nodes[v1].sum-nodes[v2].sum>lim) {
			return tl+1;
		}
		return tl;
	}
	int tm=tl+(tr-tl)/2;
	if (nodes[r[v1]].sum-nodes[r[v2]].sum>lim) {
		return findind(r[v1],r[v2],lim,tm+1,tr);
	}
	return findind(l[v1],l[v2],lim-(nodes[r[v1]].sum-nodes[r[v2]].sum),tl,tm);
}
int findind(int la, int ra, int lim) {
	int l=lower_bound(all(a),la)-a.begin();
	int r=lower_bound(all(a),ra)-a.begin();
	return findind(roots[r],roots[l],lim,0,n);
}
void init(int _n, int _a[], int _b[]) {
	n=_n;
	build(0,0,n);
	vector<pi> p;
	for (int i=0; i<n; i++) {
		p.pb({_a[i],_b[i]});
		a.pb(_a[i]);
	}
	sort(all(p));
	sort(all(a));
	for (int i=0; i<n; i++) {
		roots.pb(getnode());
		update(roots[roots.size()-2],roots.back(),0,n,p[i].se);
	}
}
vi dp,k;
int m;
int clc(int a, int b) {
	//dp[b]-dp[a]<=get(k[a]+1,k[i],k[i])-get(k[b]+1,k[i],k[i])
    //dp[a]-dp[b]>=get(k[b]+1,k[i],k[i])-get(k[a]+1,k[i],k[i])
	return findind(k[b]+1,k[a]+1,dp[a]-dp[b]);
}
int can(int _m, int _k[]) {
	m=_m;
	k.clear();
	k.pb(0);
	for (int i=0; i<m; i++) {
		k.pb(_k[i]);
	}
	sort(all(k));
	m++;
	dp.resize(m,0);
	set<int> stk={0};
	set<pi> q;
	map<int,int> ertm;
	for (int i=1; i<m; i++) {
		while (q.size() && q.begin()->fi<=k[i]) {
			auto it=next(stk.lower_bound(q.begin()->se));
			stk.erase(prev(it));
			q.erase(q.begin());
			if (it!=stk.end()) {
				q.erase({ertm[*it],*it});
				ertm[*it]=clc(*it,*prev(it));
				q.insert({ertm[*it],*it});
			}
		}
		if (k[*prev(stk.end())]==k[i]) {
			dp[i]=dp[*prev(stk.end())]-k[i];
			q.erase({ertm[*prev(stk.end())],*prev(stk.end())});
			stk.erase(prev(stk.end()));
			ertm[i]=clc(i,*prev(stk.end()));
			stk.insert(i);
			q.insert({ertm[i],i});
		}
		else {
			dp[i]=dp[*prev(stk.end())]+get(k[*prev(stk.end())]+1,k[i],k[i])-k[i];
			ertm[i]=clc(i,*prev(stk.end()));
			stk.insert(i);
			q.insert({ertm[i],i});
		}
		if (dp[i]<0) {
			return 0;
		}
	}
	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... |