Submission #1369501

#TimeUsernameProblemLanguageResultExecution timeMemory
1369501gohchingjaykInspections (NOI23_inspections)C++20
100 / 100
405 ms30188 KiB
#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] << ' ';
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...