제출 #1316069

#제출 시각아이디문제언어결과실행 시간메모리
1316069nguyenkhangninh99Inspections (NOI23_inspections)C++20
100 / 100
578 ms35620 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long

multiset<array<int, 3>> s;
map<int, int> mp;

void paint(int l, int r, int val){
    auto it1 = s.upper_bound({l, (int)1e9, (int)1e9});
    it1--;
    auto it2 = s.upper_bound({r, (int)1e9, (int)1e9});
    it2--;
 
    vector<array<int, 3>> add, del;
    auto it = it1;
    while(true){
        if(it1 == it){
            if((*it1)[0] < l) add.push_back({(*it1)[0], l - 1, (*it1)[2]});
        }
        if(it2 == it){
            if((*it2)[1] > r) add.push_back({r + 1, (*it2)[1], (*it2)[2]});
        }
        del.push_back(*it);
        it++;
        if(it == s.end() || it == next(it2)) break;
    }
    add.push_back({l, r, val});
    for(auto [x, y, time]: del){
        if(time != -1e18) mp[val - time] += min(r, y) - max(x, l) + 1;
        s.erase({x, y, time});
    }
    for(auto c: add) s.insert(c);
}

void solve(){
    int n, m, q; cin >> n >> m >> q;

    s.insert({1, n, (int)-1e18});

    int cur = 0; 
    for(int i = 1; i <= m; i++){
        int l, r; cin >> l >> r;
        paint(l, r, (cur + 1) - l);
        cur += (r - l + 1);
    }

    vector<pair<int, int>> v;
    for(auto [x, y]: mp) v.push_back({x, y});

    vector<int> suf(v.size() + 1);
    for(int i = v.size() - 1; i >= 0; i--) suf[i] = suf[i + 1] + v[i].second;

    while(q--){
        int k; cin >> k;
        cout << suf[upper_bound(v.begin(), v.end(), pair<int, int>{k, 1e18}) - v.begin()] << " ";
    }
    cout << "\n";
}

signed main(){
    ios_base::sync_with_stdio(false); 
    cin.tie(0); cout.tie(0);

    solve();
}
#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...