#include <bits/stdc++.h>
using namespace std;
#define vi vector<int>
struct segnode{
int nl, nr;
int sum = 0;
segnode * ln = nullptr;
segnode * rn = nullptr;
segnode(int l, int r) : nl(l),nr(r){}
void extend(){
if(ln != nullptr || (nl == nr)) return;
int mid = (nl + nr)/2;
ln = new segnode(nl, mid);
rn = new segnode(mid +1, nr);
}
int update(int x, int v){
if(x < nl || nr < x) return sum;
if(nl == nr) return sum += v;
extend();
return sum = ln->update(x,v) + rn->update(x,v);
}
int query(int l, int r){
if(r < nl || nr < l) return 0;
if(l <= nl && nr <= r) return sum;
if(ln == nullptr) return 0;
return ln->query(l,r) + rn->query(l,r);
}
};
struct seg2d{
int nl, nr;
segnode seg;
seg2d* ln = nullptr;
seg2d* rn = nullptr;
seg2d(int l, int r, int n) : nl(l),nr(r), seg(0,n){
if(nl == nr) return;
int mid = (nl + nr)/2;
ln = new seg2d(nl,mid,n);
rn = new seg2d(mid +1, nr,n);
}
void update(int x, int y, int v){
if(x < nl || nr < x) return;
seg.update(y,v);
if(nl == nr) return;
ln->update(x,y,v);
rn->update(x,y,v);
}
int query(int low, int hi, int l, int r){
if(hi < nl || nr < low) return 0;
if(low <= nl && nr <= hi) return seg.query(l,r);
return ln->query(low,hi,l,r) + rn->query(low,hi,l,r);
}
};
#include "teams.h"
seg2d* seg;
int n;
void init(int N, int A[], int B[]) {
n = N;
seg = new seg2d(0,N,N);
for(int i = 0; i< N; i++){
seg->update(A[i],B[i],1);
}
}
int can(int M, int K[]) {
vector<int> k(M);
for(int i = 0; i< M; i++){
k[i] = K[i];
}
sort(k.begin(),k.end());
int extraint = 0;
for(int i = 0; i< M; i++){
int nrintervals = seg->query(0,k[i],k[i],n);
nrintervals -= extraint;
if(K[i] > nrintervals) return 0;
nrintervals -= K[i];
if(i == M-1) continue;
extraint = min(nrintervals,seg->query(0,k[i], k[i+1],n));
}
return 1;
}
// int main(){
// return 0;
// }