Submission #1184929

#TimeUsernameProblemLanguageResultExecution timeMemory
1184929NotLinuxInspections (NOI23_inspections)C++20
77 / 100
2096 ms46116 KiB
#pragma GCC optimize("O3,unroll-loops")
#include <bits/stdc++.h>
using namespace std;
#define sz(x) (int)x.size()
#define all(x) x.begin() , x.end()
void solve(){
    int n,m,q;
    cin >> n >> m >> q;
    int l[m] , r[m];
    for(int i = 0;i<m;i++)
    	cin >> l[i] >> r[i];
    set<array<long long,3>>ste;// rangeleri tut
    multiset<pair<long long,long long>>ans;// pos val
    long long curtime = 0;
    for(int i = 0;i<m;i++){
    	// cout << "i : " << i << " , " << l[i] << " " << r[i] << " " << curtime << endl;
    	auto it = ste.lower_bound({l[i]+1,0,0});
    	if(it != ste.begin() and !ste.empty()){// it - 1 i isle
    		auto tmp = *prev(it);
    		// cout << "tmp : " << tmp[0] << " " << tmp[1] << " " << tmp[2] << endl;
    		if(l[i] > tmp[1] or r[i] < tmp[0]){// ortak nokta yoksa
    			37;
    		}
    		else if(l[i] <= tmp[0] and r[i] >= tmp[1]){// ben tmp yi kapliosam
    			ans.insert({(curtime + tmp[0] - l[i]) - tmp[2] , tmp[1] - tmp[0] + 1});
    			// cout << "ans : " << (curtime + tmp[0] - l[i]) - tmp[2] << " , " << tmp[1] - tmp[0] + 1 << endl;
    			ste.extract(prev(it));
    		}
    		else if(l[i] >= tmp[0] and r[i] <= tmp[1]){// o beni kapliosa
    			ans.insert({curtime - (tmp[2] + l[i] - tmp[0]) , r[i] - l[i] + 1});
    			// cout << "ans : " << curtime - (tmp[2] + l[i] - tmp[0]) << " , " << r[i] - l[i] + 1 << endl;
    			ste.extract(prev(it));
    			ste.insert({tmp[0],l[i]-1,tmp[2]});
    			ste.insert({r[i]+1,tmp[1],tmp[2] + r[i]+1 - tmp[0]});
    		}
    		else {// kesisiosak
    			if(tmp[0] < l[i]){// o soldaysa
    				ans.insert({curtime - (tmp[2] + l[i] - tmp[0]) , tmp[1] - l[i] + 1});
    				// cout << "ans : " << curtime - (tmp[2] + l[i] - tmp[0]) << " , " << tmp[1] - l[i] + 1 << endl;
    				ste.extract(prev(it));
    				ste.insert({tmp[0],l[i]-1,tmp[2]});
    			}
    			else{// ben soldaysam
    				ans.insert({(curtime + tmp[0] - l[i]) - tmp[2] , r[i] - tmp[0] + 1});
    				// cout << "ans : " << (curtime + tmp[0] - l[i]) - tmp[2] << " , " << r[i] - tmp[0] + 1 << endl;
    				ste.extract(prev(it));
    				ste.insert({r[i]+1,tmp[1],tmp[2] + r[i]+1 - tmp[0]});
    			}
    		}
    	}
    	while(it != ste.end()){
    		auto tmp = *it;
    		it = next(it);
    		// cout << "tmp : " << tmp[0] << " " << tmp[1] << " " << tmp[2] << endl;
    		if(l[i] > tmp[1] or r[i] < tmp[0]){// ortak nokta yoksa
    			37;
    		}
    		else if(l[i] <= tmp[0] and r[i] >= tmp[1]){// ben tmp yi kapliosam
    			ans.insert({(curtime + tmp[0] - l[i]) - tmp[2] , tmp[1] - tmp[0] + 1});
    			// cout << "ans : " << (curtime + tmp[0] - l[i]) - tmp[2] << " , " << tmp[1] - tmp[0] + 1 << endl;
    			ste.extract(prev(it));
    		}
    		else if(l[i] >= tmp[0] and r[i] <= tmp[1]){// o beni kapliosa
    			ans.insert({curtime - (tmp[2] + l[i] - tmp[0]) , r[i] - l[i] + 1});
    			// cout << "ans : " << curtime - (tmp[2] + l[i] - tmp[0]) << " , " << r[i] - l[i] + 1 << endl;
    			ste.extract(prev(it));
    			ste.insert({tmp[0],l[i]-1,tmp[2]});
    			ste.insert({r[i]+1,tmp[1],tmp[2] + r[i]+1 - tmp[0]});
    		}
    		else {// kesisiosak
    			if(tmp[0] < l[i]){// o soldaysa
    				ans.insert({curtime - (tmp[2] + l[i] - tmp[0]) , tmp[1] - l[i] + 1});
    				// cout << "ans : " << curtime - (tmp[2] + l[i] - tmp[0]) << " , " << tmp[1] - l[i] + 1 << endl;
    				ste.extract(prev(it));
    				ste.insert({tmp[0],l[i]-1,tmp[2]});
    			}
    			else{// ben soldaysam
    				ans.insert({(curtime + tmp[0] - l[i]) - tmp[2] , r[i] - tmp[0] + 1});
    				// cout << "ans : " << (curtime + tmp[0] - l[i]) - tmp[2] << " , " << r[i] - tmp[0] + 1 << endl;
    				ste.extract(prev(it));
    				ste.insert({r[i]+1,tmp[1],tmp[2] + r[i]+1 - tmp[0]});
    			}
    		}
    	}
    	ste.insert({l[i],r[i],curtime});
    	curtime += r[i] - l[i] + 1;
    }
    pair<long long,int>s[q];
    for(int i = 0;i<q;i++){
    	cin >> s[i].first;
    	s[i].second = i;
    }
    sort(s , s + q);
    long long cevap[q] , sum = 0;
    for(auto itr : ans)sum += itr.second;
    memset(cevap,-1,sizeof(cevap));
    auto it = ans.begin();
    for(int i = 0;i<q;i++){
    	while(it != ans.end() and (*it).first <= s[i].first){
    		sum -= (*it).second;
    		it = next(it);
    	}
    	cevap[s[i].second] = sum;
    }
    for(int i = 0;i<q;i++)
    	cout << cevap[i] << " ";
    cout << endl;
}
signed main(){
	ios_base::sync_with_stdio(0);cin.tie(0);
	int testcase=1;//cin >> testcase;
	while(testcase--)solve();
	cerr << 1000.0 * clock() / CLOCKS_PER_SEC << " ms" << endl;
}
#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...