#include "teams.h"
#include <bits/stdc++.h>
using namespace std;
const int INF = numeric_limits<int>::max()/4;
typedef long long ll;
vector<int> va, vb;
int n;
struct st {
    vector<int> v, lazy;
    int as;
};
void push (st &seg, int i) {
    int d = seg.lazy[i];
    seg.lazy[i*2] += d;
    seg.v[i*2] += d;
    seg.lazy[i*2 + 1] += d;
    seg.v[i*2 + 1] += d;
    seg.lazy[i] = 0;
}
st build (int n) {
    int as = 1 << (__lg(n) + 1);
    vector<int> v (as*2, INF);
    vector<int> lazy (as*2, 0);
    return {v, lazy, as};
}
int query (st &seg, int l, int r, int i = 1, int lo = 0, int hi = -1) {
    if (hi == -1) hi = seg.as;
    if (lo >= r || hi <= l) return INF;
    if (l <= lo && hi <= r) return seg.v[i];
    push(seg, i);
    int mid = (lo + hi) / 2;
    int q1 = query(seg, l, r, i*2, lo, mid);
    int q2 = query(seg, l, r, i*2 + 1, mid, hi);
    return min(q1, q2);
}
void update (st &seg, int id, int x, int i = 1, int lo = 0, int hi = -1) {
    if (hi == -1) hi = seg.as;
    if (lo == hi-1) {
        seg.v[i] = x;
        return;
    }
    push(seg, i);
    int mid = (lo + hi) / 2;
    if (id < mid) {
        update(seg, id, x, i*2, lo, mid);
    } else {
        update(seg, id, x, i*2 + 1, mid, hi);
    }
    seg.v[i] = min(seg.v[i*2], seg.v[i*2 + 1]);
}
void apply (st &seg, int l, int r, int d, int i = 1, int lo = 0, int hi = -1) {
    if (hi == -1) hi = seg.as;
    if (lo >= r || hi <= l) return;
    if (l <= lo && hi <= r) {
        seg.lazy[i] += d;
        seg.v[i] += d;
        return;
    }
    push(seg, i);
    int mid = (lo + hi) / 2;
    apply(seg, l, r, d, i*2, lo, mid);
    apply(seg, l, r, d, i*2 + 1, mid, hi);
}
void init(int N, int A[], int B[]) {
    vector<pair<int, int>> vq {};
    for (int i = 0; i < N; i++) {
        vq.push_back({A[i], B[i]});
    }
    sort(vq.begin(), vq.end());
    for (int i = 0; i < N; i++) {
        va.push_back(vq[i].first);
        vb.push_back(vq[i].second);
    }
    n = N;
}
int can(int M, int K[]) {
    map<int, int> ts {};
    ll total = 0;
    for (int i = 0; i < M; i++) {
        ts[K[i]] += 1;
        total += K[i];
    }
    if (total > n) return 0;
    int m = ts.size();
    vector<int> vk {};
    vector<int> vc {};
    for (auto [k, s] : ts) {
        vk.push_back(k);
        vc.push_back(k*s);
    }
    bool possible = true;
    st seg = build (m+1);
    update(seg, 0, n);
    int id = 0; // student
    set<pair<int, int>> s {}; // b, student id
    for (int i = 0; i < m; i++) {
        int val = 0;
        while (id < n && va[id] <= vk[i]) {
            s.insert({vb[id], id});
            if (vb[id] >= vk[i]) val++;
            id++;
        }
        while (!s.empty() && s.begin()->first < vk[i]) {
            auto[b, rid] = *s.begin();
            int a = va[rid];
            auto it = lower_bound(vk.begin(), vk.end(), a);
            apply(seg, 0, distance(vk.begin(), it) + 1, -1);
            s.erase(s.begin());
        }
        int sol = query(seg, 0, i+1) - vc[i];
        update(seg, i+1, sol);
        if (sol - n + id < 0) return 0;
    }
    return possible;
}
| # | 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... |