Submission #1205170

#TimeUsernameProblemLanguageResultExecution timeMemory
1205170justinlgl20Examination (JOI19_examination)C++20
100 / 100
298 ms22680 KiB
#include <bits/extc++.h>
using namespace std;
using namespace __gnu_pbds;
 
#define int long long
 
#define all(x) (x).begin(), (x).end()
 
template<template<typename> class Container, typename G>
ostream& operator<<(ostream& os, Container<G> x) {
    int f = 0; os << '{'; for (auto &i: x) os << (f++ ? ", " : ""), os << i; os << "}";
    return os;
}
 
void _print() {cerr << "]\n";}
 
template<typename T, typename... V>
void _print(T t, V... v) {cerr << t; if (sizeof...(v)) cerr <<", "; _print(v...);}
 
#ifdef DEBUG
#define dbg(x...) cerr << "\e[91m"<<__func__<<":"<<__LINE__<<" [" << #x << "] = ["; _print(x); cerr << "\e[39m" << endl;
#else
#define dbg(x...)
#endif

#define pii pair<int, int>
#define f first
#define s second

typedef tree<pii,null_type,less<pii>,rb_tree_tag,tree_order_statistics_node_update> ost;

int32_t main() {
	cin.tie(0)->sync_with_stdio(false);
	int n,q;cin>>n>>q;vector<pair<pii,pii>>e(n+q);for(int i=0;i<n;i++){cin>>e[i].f.f>>e[i].f.s;e[i].s={-1ll,-1ll};}
	for(int i=n;i<n+q;i++){cin>>e[i].f.f>>e[i].f.s>>e[i].s.f;e[i].s.s=i-n;}
	vector<int> ans(q,0);
	sort(all(e),[&](auto a,auto b){
		int va=a.f.f+a.f.s;if(a.s.f!=-1)va=a.s.f;
		int vb=b.f.f+b.f.s;if(b.s.f!=-1)vb=b.s.f;
		if(va!=vb)return va>vb;// bigger sum first
		if(a.s.f==-1 and b.s.f!=-1)return true;
		if(a.s.f!=-1 and b.s.f==-1)return false;
		return false;
	});
	for(auto i:e){
		dbg(i.f.f,i.f.s,i.s.f,i.s.s);
		int v=i.f.f+i.f.s;if(i.s.f!=-1)v=i.s.f;
		dbg(v);
	}
	function<void(int,int)> cdq=[&](int l,int r){
		int tm=(l+r)>>1;
		if(l==r)return;
		// get students in l and answer stuff on right
		vector<pii> kids;
		for(int i=l;i<=tm;i++){
			if(e[i].s.f==-1)kids.emplace_back(e[i].f);
		}
		vector<pair<pii,int>> queries;
		for(int i=tm+1;i<=r;i++){
			if(e[i].s.f!=-1)queries.emplace_back(e[i].f,e[i].s.s);
		}
		sort(all(kids));reverse(all(kids));sort(all(queries));reverse(all(queries));
		int inx=0;
		ost s;int cnt=0;
		for(auto i:queries){
			while(inx<kids.size() and kids[inx].f>=i.f.f){
				s.insert(make_pair(kids[inx].s,cnt++));
				inx++;
			}
			ans[i.s]+=s.size()-s.order_of_key(make_pair(i.f.s,-1ll));
		}
		cdq(l,tm);
		cdq(tm+1,r);
	};
	cdq(0,e.size()-1);
	for(int i=0;i<q;i++){
		cout<<ans[i]<<"\n";
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...