Submission #885765

#TimeUsernameProblemLanguageResultExecution timeMemory
885765dsyzExamination (JOI19_examination)C++17
100 / 100
622 ms271724 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define MAXN (1000005)
struct node {
	ll s,e,m,v;
	node *l, *r;
	node(ll _s,ll _e){
		s = _s;
		e = _e;
		m = (s + e) / 2;
		v = 0;
		if(s != e){
			l = new node(s,m);
			r = new node(m + 1,e);
		}
	}
	void update(ll x,ll nval){
		if(s == e){
			v += nval;
			return;
		}else{
			if(x > m) r->update(x,nval);
			else l->update(x,nval);
			v = l->v + r->v;
		}
	}
	ll query(ll x,ll y){
		if(s == x && e == y){
			return v;
		}else{
			if(x > m) return r->query(x,y);
			else if(y <= m) return l->query(x,y);
			else return l->query(x,m) + r->query(m+1,y);
		}
	}
} *Sroot, *Troot;
int main() {
	ios_base::sync_with_stdio(false);cin.tie(0);
	ll N,Q;
	cin>>N>>Q;
	Sroot = new node(0,MAXN - 1);
	Troot = new node(0,MAXN - 1);
	pair<pair<ll,ll>,pair<ll,ll> > queries[Q];
	pair<pair<ll,ll>,pair<ll,ll> > students[N];
	vector<ll> d;
	for(ll i = 0;i < N;i++){
		cin>>students[i].second.first>>students[i].second.second;
		students[i].first.first = students[i].second.first + students[i].second.second;
		students[i].first.second = i;
		d.push_back(students[i].first.first);
		d.push_back(students[i].second.first);
		d.push_back(students[i].second.second);
	}
	for(ll i = 0;i < Q;i++){
		cin>>queries[i].second.first>>queries[i].second.second>>queries[i].first.first;
		queries[i].first.first = max(queries[i].first.first,queries[i].second.first + queries[i].second.second);
		queries[i].first.second = i;
		d.push_back(queries[i].first.first);
		d.push_back(queries[i].second.first);
		d.push_back(queries[i].second.second);
	}
	sort(d.begin(),d.end());
	d.resize(unique(d.begin(),d.end()) - d.begin());
	for(ll i = 0;i < N;i++){
		students[i].first.first = lower_bound(d.begin(),d.end(),students[i].first.first) - d.begin();
		students[i].second.first = lower_bound(d.begin(),d.end(),students[i].second.first) - d.begin();
		students[i].second.second = lower_bound(d.begin(),d.end(),students[i].second.second) - d.begin();
	}
	for(ll i = 0;i < Q;i++){
		queries[i].first.first = lower_bound(d.begin(),d.end(),queries[i].first.first) - d.begin();
		queries[i].second.first = lower_bound(d.begin(),d.end(),queries[i].second.first) - d.begin();
		queries[i].second.second = lower_bound(d.begin(),d.end(),queries[i].second.second) - d.begin();
	}
	sort(students,students + N,greater<pair<pair<ll,ll>,pair<ll,ll> > >());
	sort(queries,queries + Q,greater<pair<pair<ll,ll>,pair<ll,ll> > >());
	ll ptr = -1;
	ll Qu[Q];
	for(ll q = 0;q < Q;q++){
		ll Z = queries[q].first.first;
		ll X = queries[q].second.first; //S <= X
		ll Y = queries[q].second.second; //T <= Y
		while(ptr + 1 < N && students[ptr + 1].first.first >= Z){
			ptr++;
			Sroot -> update(students[ptr].second.first,1);
			Troot -> update(students[ptr].second.second,1);
		}
		ll ans = ptr + 1;
		if(X >= 1) ans -= Sroot -> query(0,X - 1);
		if(Y >= 1) ans -= Troot -> query(0,Y - 1);
		Qu[queries[q].first.second] = ans;
	}
	for(ll q = 0;q < Q;q++){
		cout<<Qu[q]<<'\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...