Submission #1317432

#TimeUsernameProblemLanguageResultExecution timeMemory
1317432namhhInspections (NOI23_inspections)C++20
100 / 100
941 ms41844 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define fi first
#define se second
const int N = 2e5+5;
int n,m,q,l,r,ans[N];
map<int,int>mp;
set<tuple<int,int,int>>st;
vector<pii>loj;
pii qr[N];
signed main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cin >> n >> m >> q;
	int sum = 0;
	for(int i = 1; i <= m; i++){
		cin >> l >> r;
		if(st.empty()){
			st.insert({l,r,sum});
    		sum += r-l+1;
    		continue;
		}
		auto x = st.lower_bound({l,-1,-1});
		if(x != st.begin()) --x;
		vector<tuple<int,int,int,int>>dm;
		while(x != st.end()){
			auto [l1,r1,t] = *x;
			if(r < l1) break;
			if(r1 < l){
				++x;
				continue;
			}
			if(l <= l1 && r1 <= r){
				int vc = sum+l1-l+1;
				mp[vc-t-2] += r1-l1+1;
 			    dm.push_back({l1,r1,t,-1});
			    ++x;
			}
			else if(l <= l1 && r < r1){
				int vc = sum+l1-l+1;
				dm.push_back({l1,r1,t,-1});
				mp[vc-t-2] += r-l1+1;
			    dm.push_back({r+1,r1,t+r-l1+1,1});
			    break;
			}
			else if(l1 < l && r1 <= r){
				int vc = t+l-l1;
				dm.push_back({l1,r1,t,-1});
				dm.push_back({l1,l-1,t,1});
				mp[sum-vc-1] += r1-l+1;
			    ++x;
			}
			else{
				int vc = t+l-l1;
				mp[sum-vc-1] += r-l+1;
			    dm.push_back({l1,r1,t,-1});
			    dm.push_back({l1,l-1,t,1});
			    dm.push_back({r+1,r1,t+(r+1)-l1,1});
			    break;
			}
		}
		st.insert({l,r,sum});
		sum += r-l+1;
		for(auto[l1,r1,t,type]: dm){
			if(type == 1) st.insert({l1,r1,t});
			else st.erase({l1,r1,t});
		}
	}
	sum = 0;
	for(auto it = mp.rbegin(); it != mp.rend(); ++it){
		mp[it->fi] += sum;
		sum = it->se;
    }
    for(auto it: mp) loj.push_back(it);
    loj.push_back({1e17,0});
    loj.push_back({1e18,0});
    int ptr = 0;
    for(int i = 1; i <= q; i++){
    	cin >> qr[i].fi;
    	qr[i].se = i;
	}
	sort(qr+1,qr+q+1);
	for(int i = 1; i <= q; i++){
		while(qr[i].fi > loj[ptr].fi) ptr++;
		ans[qr[i].se] = loj[ptr].se;
	}
	for(int i = 1; i <= q; i++) cout << ans[i] << " ";
}
#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...