Submission #1200516

#TimeUsernameProblemLanguageResultExecution timeMemory
1200516ofozInspections (NOI23_inspections)C++20
0 / 100
0 ms328 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;
#define pi pair<int, int>
#define ppi pair<pair<int, int>, int>
#define vi vector<int>

void solve() {
    int n, m, q;
    cin >> n >> m >> q;
    int s = 0;
    vector<ppi> pairs;
    for (int i = 0; i < m; i++) {
        int l, r;
        cin >> l >> r;
        pairs.push_back({{l, r}, s});
        s += (r-l+1);
    }
    vector<pi> queries(q);
    int x;
    for (int i = 0; i < q; i++) {
        cin >> x;
        queries[i] = {x, i};
    }
    sort(pairs.rbegin(), pairs.rend());
    map<int, int> mx;
    set<pi> cur;
    multiset<pi> end;

    int t = 0;
    int start = 0;
    int left = 0;
    for (int i = 1; i <= n; i++) {
        t++;
        while (!pairs.empty() && pairs.back().first.first <= i) {
            cur.insert({pairs.back().second - i + 1, t});
            end.insert({pairs.back().first.second, pairs.back().second - i + 1});
            pairs.pop_back();
            auto it = cur.lower_bound({pairs.back().second - i + 1, t});

            if (it == cur.begin() || it == prev(cur.end(), 1)) continue;

            auto prv = prev(it, 1);
            auto nxt = next(it, 1);
            int maxm = max(prv->second, nxt->second);
            int diff = nxt->first - prv->first;
            mx[diff] += (t - maxm);
            start += (t - maxm);
        }
        
        while (!end.empty() && end.begin()->first < i) {
            auto it = cur.upper_bound({end.begin()->second, -1});
            if (it != cur.begin()) {
                auto prv = prev(it, 1);
                int maxm = max(prv->second, it->second);
                int diff = it->first - prv->first;
                mx[diff] += (t - maxm);
                start += (t - maxm);
            }

            if (it != prev(cur.end(), 1)) {
                auto nxt = next(it, 1);
                int maxm = max(nxt->second, it->second);
                int diff = nxt->first - it->first;
                
                mx[diff] += (t - maxm);
                start += (t - maxm) + 1;
            }
            cur.erase(it);
            end.erase(end.begin());
        }
        

        if (cur.size() < 2) { continue; }
        left++;
    }



    vector<int> res(q);
    sort(queries.begin(), queries.end());
    int j = 0;
    int c = start;
    for (pi p : mx) {
        while (j < q && queries[j].first < p.first) {
            res[queries[j].second] = c;
            j++;
            continue;
        }
        c -= p.second;
        if (j >= q) break;
        if (p.first > queries[j].first) continue;
        res[queries[j].second] = c;
    }
    for (int x : res) cout << x << ' ';
}

/*
iterate through each machine i. how do we process the events?
for each l, we insert the number of days s into the set
for each r, we erase the number of days 
*/
signed main() {
    solve();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...