Submission #1205836

#TimeUsernameProblemLanguageResultExecution timeMemory
1205836ByeWorldInspections (NOI23_inspections)C++20
100 / 100
605 ms56712 KiB
#include <bits/stdc++.h>
#define int long long
#define ll long long
#define se second
#define fi first
#define pb push_back
#define lf (id<<1)
#define rg ((id<<1)|1)
#define md ((l+r)>>1)
using namespace std;
typedef pair<ll,ll> pii;
typedef pair<pii,ll> ipii;
const int MAXN = 2e5+10;
const int SQRT = 450;
const int INF = 2e18+10;
const int MOD = 998244353;
const int LOG = 20;
int sum(int a, int b){ return (a+MOD+b)%MOD; }
void chsum(int &a, int b){ a = (a+MOD+b)%MOD; }
int mul(int a, int b){ return (a*b)%MOD; }
void chmul(int &a, int b){ a = (a*b)%MOD; }
void chmn(auto &a, auto b){ a = min(a, b); }
void chmx(auto &a, auto b){ a = max(a, b); }

int n, m, q;
int ans[MAXN];
map<int,int> cnt;
set <ipii> ran;

void ins(int l, int r, int x){
	// cout << l << ' '<< r <<' ' << x << " x\n";
	auto it = ran.lower_bound(ipii(pii(l+1, -1),-1));
	if(it != ran.begin()) it--;
	vector<ipii> ADD;
	while(true){
		if(it==ran.end() || r < (*it).fi.fi) break;
		if((*it).fi.se < l){ it++; continue; }
		// cek perpot
		int X = (*it).fi.fi, Y = (*it).fi.se, TIM = (*it).se;
		int le = max(l, X), ri = min(r, Y);
		int delt = TIM + le-X, t = x+le-l; // le-ri, t...
		cnt[t-delt] += ri-le+1;

		// cout << t-delt << ' ' << ri-le+1 << " num\n";
		// delete
		auto it2 = it; it++;
		ran.erase(it2);
		if(X <= l-1) ADD.pb({pii(X, l-1), TIM});
		if(r+1 <= Y) ADD.pb({pii(r+1, Y), TIM + r+1-X});
	}
	// it = ran.begin();
	// while(it != ran.end()){
	// 	if(it==ran.end() || r < (*it).fi.fi || (*it).fi.se < l){
	// 		it++; continue;
	// 	}
	// 	// cek perpot
	// 	int X = (*it).fi.fi, Y = (*it).fi.se, TIM = (*it).se;
	// 	int le = max(l, X), ri = min(r, Y);
	// 	int delt = TIM + le-X, t = x+le-l; // le-ri, t...
	// 	cnt[t-delt] += ri-le+1;

	// 	// cout << t-delt << ' ' << ri-le+1 << " num\n";
	// 	// delete
	// 	auto it2 = it; it++;
	// 	ran.erase(it2);
	// 	if(X <= l-1) ADD.pb({pii(X, l-1), TIM});
	// 	if(r+1 <= Y) ADD.pb({pii(r+1, Y), TIM + r+1-X});
	// }

	for(auto in : ADD) ran.insert(in);
	ran.insert(ipii(pii(l, r), x));

	// for(auto [x, p] : ran) cout<<x.fi<<' '<<x.se<<' '<<p<<" pp\n";
	// 	cout <<"Xx\n";
}
// 1 2 3 3 4 5 2 3
// 1 2 3 4 5 2 3 1 2 3 4 5 2 3
// 1 2 4 5 1 2 3 4 5
signed main(){
	ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m>>q;

	int tim = 1;
	ran.insert({pii(n+1,n+1), -1});
	for(int i=1; i<=m; i++){
		int l, r; cin>>l>>r;
		ins(l, r, tim);
		tim += r-l+1;
		// for(int j=l; j<=r; j++){
		// 	++tim;
		// 	if(arr[j] != -1) cnt[tim-arr[j]]++;
		// 	arr[j] = tim;
		// }
	}
	vector<pii> CNT;
	for(auto [x, y] : cnt) CNT.pb({x,y}); 
	set <pii> s;
	int tot = 0;
	for(int j=CNT.size()-1; j>=0; j--){
		// cout << CNT[j].fi << ' ' << CNT[j].se << " xx\n";
		s.insert({CNT[j].fi, CNT[j].se+tot});
		tot += CNT[j].se;
	}
	s.insert({INF, 0});
	for(int i=1; i<=q; i++){
		int x; cin>>x; x++;
		ans[i] = (*s.lower_bound(pii(x, -1))).se;
	}
	for(int i=1; i<=q; i++) cout << ans[i] << " \n"[i==q];
}
#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...