#pragma GCC optimize("O3,inline")
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define int ll
using ii = pair<int, int>;
using iii = pair<int, ii>;
constexpr int MAXN = 200'000 + 5;
constexpr int INF = 1e18 + 5;
constexpr int LOG = 20;
vector<ii> safety;
vector<int> starts[MAXN];
vector<int> endings[MAXN];
int prefDings[MAXN];
int N, M, Q;
struct swo {
set<int> s;
int offset = 0;
void inc_off(int x) {
offset += x;
}
void emplace(int v, int x) {
int l = N - x;
v -= offset;
s.emplace(v);
auto it = s.find(v);
if (it != s.begin()) {
int k = v - *prev(it);
prefDings[0] += l;
prefDings[lower_bound(safety.begin(), safety.end(), ii{k, 0}) - safety.begin()] -= l;
}
if (it != --s.end()) {
int k = *next(it) - v;
prefDings[0] += l;
prefDings[lower_bound(safety.begin(), safety.end(), ii{k, 0}) - safety.begin()] -= l;
}
if (it != s.begin() && it != --s.end()) {
int k = *next(it) - *prev(it);
prefDings[0] -= l;
prefDings[lower_bound(safety.begin(), safety.end(), ii{k, 0}) - safety.begin()] += l;
}
}
void erase(int v, int x) {
v -= offset;
int l = N - 1 - x;
auto it = s.find(v);
if (it != s.begin()) {
int k = v - *prev(it);
prefDings[0] -= l;
prefDings[lower_bound(safety.begin(), safety.end(), ii{k, 0}) - safety.begin()] += l;
}
if (it != --s.end()) {
int k = *next(it) - v;
prefDings[0] -= l;
prefDings[lower_bound(safety.begin(), safety.end(), ii{k, 0}) - safety.begin()] += l;
}
if (it != s.begin() && it != --s.end()) {
int k = *next(it) - *prev(it);
prefDings[0] += l;
prefDings[lower_bound(safety.begin(), safety.end(), ii{k, 0}) - safety.begin()] -= l;
}
s.erase(v);
}
};
signed main() {
cin.tie(nullptr)->sync_with_stdio(false); cout.tie(nullptr);
cin >> N >> M >> Q;
safety.resize(Q);
int m = 0;
for (int i = 0; i < M; ++i) {
int l, r; cin >> l >> r;
l--, r--;
starts[l].emplace_back(m);
endings[r].emplace_back((m += r - l + 1) - 1);
}
for (int i = 0; i < Q; ++i) {
cin >> safety[i].first;
safety[i].second = i;
}
sort(safety.begin(), safety.end());
swo sw = swo{};
for (int i = 0; i < N; ++i) {
for (int st : starts[i]) sw.emplace(st, i);
for (int en : endings[i]) sw.erase(en, i);
sw.inc_off(1);
}
vector<int> answers(Q);
int run = 0;
for (int i = 0; i < Q; ++i) {
run += prefDings[i];
answers[safety[i].second] = run;
}
for (int i = 0; i < Q; ++i) cout << answers[i] << ' ';
}