#include "bits/stdc++.h"
#define int long long
#define pb push_back
using namespace std;
const int inf = 1e9*2;
const int N = 2e5 + 20;
int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    int n, m, q;
    cin>>n>>m>>q;
    vector<int> l(m), r(m), pre(m+1);
    for(int i = 0; i < m; i++){
        cin>>l[i]>>r[i];
        pre[i+1] = pre[i] + (r[i] - l[i] + 1);
    }
    vector<pair<int, int> > query(q);
    for(int i = 0; i < q; i++){
        cin>>query[i].first;
        query[i].second = i;
    }
    set<array<int, 3> > ranges;
    vector<pair<int, int> > upd;
    for(int i = 0; i < m; i++){
        // set ve l, r matchlerine bak her biri için {x, y} = eğer ki s değeri x ten küçük eşitse cevap += y
        if(!ranges.size()){
            ranges.insert({l[i], r[i], i});
            continue;
        }
        vector<array<int, 3> > ekle, sil;
        auto k = ranges.lower_bound({l[i], 0, 0});
        if(k != ranges.begin()) k--;
        while(k != ranges.end() && (*k)[0] <= r[i]){
            bool kesis = 0;
            if((*k)[0] >= l[i] && (*k)[1] <= r[i]){ // icinde
                int kind = (*k)[2];
                int poskind = pre[kind] + ((*k)[0] - l[kind] + 1);
                int posi = pre[i] + ((*k)[0] - l[i] + 1);
                int dis = posi - poskind;
                upd.pb({dis, (*k)[1] - (*k)[0] + 1});
                kesis = 1;
            }
            if((*k)[0] < l[i] && (*k)[1] <= r[i]){ // sol tarafimda
                int kind = (*k)[2];
                int poskind = pre[kind] + (l[i] - l[kind] + 1);
                int posi = pre[i] + 1;
                int dis = posi - poskind;
                upd.pb({dis, (*k)[1] - l[i] + 1});
                ekle.pb({(*k)[0], l[i]-1, kind});
                kesis = 1;
            }
            if((*k)[0] >= l[i] && (*k)[1] > r[i]){ // sag tarafimda
                int kind = (*k)[2];
                int poskind = pre[kind] + ((*k)[0] - l[kind] + 1);
                int posi = pre[i] + ((*k)[0] - l[i] + 1);
                int dis = posi - poskind;
                upd.pb({dis, r[i] - (*k)[0] + 1});
                ekle.pb({r[i] + 1, (*k)[1], kind});
                kesis = 1;
            }
            if((*k)[0] < l[i] && (*k)[1] > r[i]){ // beni iceriyor
                int kind = (*k)[2];
                int poskind = pre[kind] + (l[i] - l[kind] + 1);
                int posi = pre[i] + 1;
                int dis = posi - poskind;
                upd.pb({dis, r[i] - l[i] + 1});
                ekle.pb({(*k)[0], l[i]-1, kind});
                ekle.pb({r[i] + 1, (*k)[1], kind});
                kesis = 1;
            }
            if(kesis) sil.pb(*k);
            k++;
        }
        ekle.pb({l[i], r[i], i});
        for(auto itr: sil){
            ranges.erase(ranges.find(itr));
        }
        for(auto itr: ekle){
            ranges.insert(itr);
        }
    }
    sort(upd.rbegin(), upd.rend());
    sort(query.rbegin(), query.rend());
    int cur = 0, updind = 0;
    vector<int> ans(q);
    for(auto itr: query){
        while(updind < upd.size() && upd[updind].first > itr.first){
            cur += upd[updind].second;
            updind++;
        }
        ans[itr.second] = cur;
    }
    for(int i = 0; i < q; i++){
        cout<<ans[i]<<" ";
    }
    cout<<endl;
    return 0;
}
| # | 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... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |