Submission #1208514

#TimeUsernameProblemLanguageResultExecution timeMemory
1208514Ghulam_JunaidInspections (NOI23_inspections)C++20
100 / 100
641 ms40692 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const ll N = 2e5 + 10;
ll n, m, q, day[N], l[N], r[N], last[N];
map<ll, ll> cnt;

ll get_day(ll i, ll x){
    return day[i] + x - l[i];
}

int main(){
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    cin >> n >> m >> q;
    set<pair<ll, ll>> st;
    st.insert({0, 0});
    st.insert({n + 1, 0});
    for (ll i = 1; i <= m; i ++){
        cin >> l[i] >> r[i];
        day[i + 1] = day[i] + (r[i] - l[i] + 1);

        auto it = st.upper_bound({l[i], -2});
        it--;

        vector<pair<ll, ll>> del, add;
        while ((*it).first <= r[i]){
            auto nxt = it;
            nxt++;

            if ((*nxt).first <= l[i]){
                it++;
                continue;
            }

            if ((*it).first >= l[i]){
                del.push_back(*it);
                if ((*nxt).first > r[i] + 1)
                    add.push_back({r[i] + 1, (*it).second});
            }
            else{
                if ((*nxt).first > r[i] + 1)
                    add.push_back({r[i] + 1, (*it).second});
            }

            // cout << "Reaching " << (*it).first << endl;
            if ((*it).second <= 0){
                it++;
                continue;
            }

            ll llersection = min(r[i], (*nxt).first - 1) - max(l[i], (*it).first) + 1;
            ll common = l[i];
            if ((*it).first >= l[i])
                common = (*it).first;
            ll diff = get_day(i, common) - get_day((*it).second, common);

            // cout << "Add " << llersection << " in " << diff << endl;
            cnt[diff - 1] += llersection;

            it++;
        }
        add.push_back({l[i], i});

        for (auto P : del)
            st.erase(P);
        for (auto P : add)
            st.insert(P);
    }

    vector<pair<ll, ll>> vec;
    for (auto [x, c] : cnt){
        // cout << x << " : " << c << endl;
        vec.push_back({x, c});
    }
    sort(vec.begin(), vec.end());

    ll SZ = vec.size();
    ll suff[SZ + 5] = {};
    for (ll i = SZ - 1; i >= 0; i --){
        suff[i] = suff[i + 1] + vec[i].second;
        // cout << i << " :: " << vec[i].second << " " << suff[i] << endl;
    }

    for (ll i = 0; i < q; i ++){
        ll val;
        cin >> val;

        ll lb = lower_bound(vec.begin(), vec.end(), (pair<ll, ll>){val, -1}) - vec.begin();

        if (lb >= vec.size()) cout << "0 ";
        else cout << suff[lb] << " ";
    }
    cout << endl;
}
#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...