제출 #234085

#제출 시각아이디문제언어결과실행 시간메모리
234085wwddExamination (JOI19_examination)C++14
100 / 100
978 ms62964 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pl;
typedef pair<pl,ll> tl;
vector<pl> w,qu,qp;
set<ll> bx,by;
map<ll,ll> mx,my;
class ST {
	private:
		vector<ll> st;
		int n;
	public:
		ST(int n_) {
			n = n_;
			st.assign(2*n,0);
		}
		void up(ll p, ll val) {
			p += n;
			st[p] += val;
			while(p > 1) {
				st[p>>1] = st[p] + st[p^1];
				p >>= 1;
			}
		}
		ll get(ll l, ll r) {
			l += n;r += n;
			ll res = 0;
			for(;l<r;l>>=1,r>>=1) {
				if(l&1) {
					res += st[l];
					l++;
				}
				if(r&1) {
					r--;
					res += st[r];
				}
			}
			return res;
		}
		ll size() {
			return n;
		}
};
int main() {
	ios::sync_with_stdio(0);cin.tie(0);
	ll n,q;
	cin >> n >> q;
	for(int i=0;i<n;i++) {
		ll a,b;
		cin >> a >> b;
		w.push_back({a,b});
		qp.push_back({a+b,(i+1)});
		bx.insert(a);
		by.insert(b);
	}
	for(int i=0;i<q;i++) {
		ll a,b,c;
		cin >> a >> b >> c;
		c = max(c,a+b);
		bx.insert(a);
		by.insert(b);
		qu.push_back({a,b});
		qp.push_back({c,-(i+1)});
	}
	for(auto& it: bx) {
		ll sz = mx.size();
		mx[it] = sz;
	}
	for(auto& it: by) {
		ll sz = my.size();
		my[it] = sz;
	}
	sort(qp.begin(),qp.end());
	ST sx(mx.size()),sy(my.size());
	vector<ll> res(q,0);
	for(int point = qp.size()-1;point >= 0;point--) {
		ll idx = qp[point].second;
		ll id = abs(idx)-1;
		if(idx < 0) {
			ll xv = mx[qu[id].first];
			ll yv = my[qu[id].second];
			ll vx = sx.get(xv,sx.size());
			ll vy = sy.get(0,yv);
			res[id] = vx-vy;
		} else {
			ll xv = mx[w[id].first];
			ll yv = my[w[id].second];
			sx.up(xv,1);
			sy.up(yv,1);
		}
	}
	for(int i=0;i<q;i++) {
		cout << res[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...