// Programmer: Shadow1
#include <bits/stdc++.h>
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using ll = long long;
using ld = long double;
using ull = unsigned long long;
using str = string; // yay python!
#define i64 int64_t
#define show(x) cerr << (#x) << " = " << (x) << '\n';
#define output_vector(v) for(auto &x : v){cout << x << ' ';}cout << '\n';
#define output_pairvector(v) for(auto &x : v){cout << x.first << " " << x.second << '\n';}
#define read_vector(v) for(auto &x : v){cin >> x;}
#define vt vector
#define pq priority_queue
#define pb push_back
#define eb emplace_back
#define pii pair<int,int>
#define fir first
#define sec second
#define sz(x) ll(x.size())
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define int ll
#define discretize(x) sort(x.begin(), x.end()); x.erase(unique(x.begin(), x.end()), x.end());
const int INF = 1e15;
void solve() {
int n, m, q;
cin >> n >> m >> q;
vector<int> l(m+1), r(m+1), ps(m+1);
for(int i=1; i<=m; ++i) {
cin >> l[i] >> r[i];
ps[i] = ps[i-1] + r[i] - l[i] + 1;
}
vector<pii> qry(q);
vector<int> ans(q);
for(int i=0; i<q; ++i) {
cin >> qry[i].fir;
qry[i].sec = i;
}
sort(all(qry));
set<pair<pii, pii>> s, temp; // s holds distinct disjoint ranges
int base = 0;
for(int i=1; i<=m; ++i) {
// show(i);
pii u = {l[i], INF};
pair<pii,pii> k = make_pair(u, make_pair(INF, INF));
auto left = s.upper_bound(k);
int safe = 0;
auto right = s.end();
bool have_l = false, have_r = false;
for(auto it=left; it != s.end(); ++it) {
if((*it).fir.sec > r[i]) {
if((*it).fir.fir <= r[i]) right = it;
break;
}
safe = (*it).fir.sec - l[i] + ps[i-1] - ps[(*it).sec.fir] + (*it).sec.sec;
int d = min(r[i], (*it).fir.sec) - max(l[i], (*it).fir.fir) + 1;
base += d;
pii k = {safe, INF};
auto it2 = upper_bound(all(qry), k);
if(it2 != qry.end()) {
int x = it2 - qry.begin();
ans[qry[x].sec] -= d;
}
temp.insert(*it);
}
// if(i == 2) show(base);
if(left != s.begin()) {
--left;
if((*left).fir.sec >= l[i]) {
have_l = true;
safe = (*left).fir.sec - l[i] + ps[i-1] - ps[(*left).sec.fir] + (*left).sec.sec;
int d = min(r[i], (*left).fir.sec) - max(l[i], (*left).fir.fir) + 1;
base += d;
pii k = {safe, INF};
auto it2 = upper_bound(all(qry), k);
if(it2 != qry.end()) {
int x = it2 - qry.begin();
ans[qry[x].sec] -= d;
}
}
}
if(right != s.end()) {
if(*right != *left) {
have_r = true;
safe = (*right).fir.sec - l[i] + ps[i-1] - ps[(*right).sec.fir] + (*right).sec.sec;
int d = min(r[i], (*right).fir.sec) - max(l[i], (*right).fir.fir) + 1;
base += d;
pii kk = {safe, INF};
auto it2 = upper_bound(all(qry), kk);
if(it2 != qry.end()) {
int x = it2 - qry.begin();
ans[qry[x].sec] -= d;
}
}
}
if(have_l) {
auto g = *left;
if(g.fir.fir <= l[i] && g.fir.sec >= r[i]) {
// g.sec.sec += r[i] - g.fir.fir + 1;
g.fir.fir = r[i] + 1;
s.insert(g);
g = *left;
g.sec.sec += g.fir.sec - l[i] + 1;
g.fir.sec = l[i] - 1;
s.insert(g);
}
else if(g.fir.fir < l[i] && g.fir.sec >= l[i]) {
g.sec.sec += g.fir.sec - l[i] + 1;
g.fir.sec = l[i] - 1;
// if(i == 3) show(g.fir.sec);
// g.sec.fir = i;
s.insert(g);
}
s.erase(left);
}
if(have_r) {
auto g = *right;
if(g.fir.fir <= r[i] && g.fir.sec > r[i]) {
// g.sec.sec += r[i] - g.fir.fir + 1;
g.fir.fir = r[i] + 1;
// g.sec.fir = i;
s.insert(g);
}
s.erase(right);
}
s.insert({{l[i], r[i]}, {i, 0}});
for(auto &stuff : temp)
s.erase(stuff);
temp.clear();
// show(base);
}
// for(auto &S : s) {
// show((S).fir.fir);
// show((S).fir.sec);
// }
ans[qry[0].sec] += base;
for(int i=1; i<q; ++i) {
ans[qry[i].sec] += ans[qry[i-1].sec];
}
output_vector(ans);
}
// CHECK YOUR OVERFLOWS!!!!
signed main() {
// freopen("output.txt", "w", stdout);
// freopen("input.txt", "r", stdin);
ios::sync_with_stdio(false);
cin.tie(NULL);
int T = 1;
// cin >> T;
for(int tc = 1; tc <= T; ++tc) {
// cout << "Case #" << tc << ": ";
solve();
}
return 0;
}
/* CHECK :
1. COMPARATOR FUNCTION MUST RETURN FALSE WHEN ARGUMENTS ARE EQUAL!!!
2. Overflow! Typecase int64_t on operations if varaibles are int
3. Check array bounds!!!
4. Check array indexing!!!
5. Edge cases. (N==1)!!!
*/
# | 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... |