제출 #470451

#제출 시각아이디문제언어결과실행 시간메모리
470451NamnamseoExamination (JOI19_examination)C++17
100 / 100
1502 ms286172 KiB
#include <algorithm>
#include <iostream>
#include <tuple>
#include <utility>
#include <vector>
using namespace std;
using pp=pair<int,int>;
using vi=vector<int>;
const int maxn = int(1e5) + 10;
#define all(v) v.begin(), v.end()
#define pb push_back
#define x first
#define y second

int n;
pp d[maxn];

struct MergeSortTree {
	int m; vi xs, *t;

	void init(int l, int r) {
		xs.resize(r-l);
		for (m=1; m<r-l; m*=2);
		t = new vector<int>[m*2];
		for (int i=l; i<r; ++i) xs[i-l] = d[i].x;
		sort(all(xs));
		for (int i=l; i<r; ++i) {
			int x, y; tie(x, y) = d[i];
			x = lower_bound(all(xs), x) - xs.begin();
			t[x+m].pb(y);
		}
		for (int i=0; i<int(xs.size()); ++i) sort(all(t[m+i]));
		for (int i=m-1; 1<=i; --i) {
			auto &v=t[i], &vl=t[i*2], &vr=t[i*2+1];
			v.resize(vl.size()+vr.size());
			merge(all(vl), all(vr), v.begin());
		}
	}

	int rect(int l, int r, int d, int u) {
		l = lower_bound(all(xs), l) - xs.begin();
		r = upper_bound(all(xs), r) - xs.begin() - 1;
		if (l > r || d > u) return 0;
		int ret = 0;
		auto f = [&](vi &v) { ret += upper_bound(all(v), u) - lower_bound(all(v), d); };
		for (l+=m, r+=m; l<=r; l/=2, r/=2) {
			if (l%2 == 1) f(t[l++]);
			if (r%2 == 0) f(t[r--]);
		}
		return ret;
	}
} mst[262144];

void init(int p, int l, int r) {
	mst[p].init(l, r);
	if (l+1 == r) return;
	int md = (l+r)/2;
	init(p*2, l, md); init(p*2+1, md, r);
}

struct { int l, r, d, u; } Q;
int rect(int sl, int sr, int p, int l, int r) {
	if (sr<=l || r<=sl) return 0;
	if (sl<=l && r<=sr) return mst[p].rect(Q.l, Q.r, Q.d, Q.u);
	int md = (l+r)/2;
	return rect(sl, sr, p*2, l, md) + rect(sl, sr, p*2+1, md, r);
}

bool pcomp(const pp &a, const pp &b) {
	return (a.x+a.y) < (b.x+b.y);
}

int main() { cin.tie(0)->sync_with_stdio(0);
	int q; cin >> n >> q;
	for (int i=0; i<n; ++i) cin >> d[i].x >> d[i].y;
	sort(d, d+n, pcomp);
	init(1, 0, n);

	for(;q--;) {
		int x, y, s; cin >> x >> y >> s;
		int j = lower_bound(d, d+n, pp{s, 0}, pcomp)-d;
		const int inf = int(1e9) + 10;
		Q = {x, inf, y, inf};
		cout << rect(j, n, 1, 0, n) << '\n';
	}
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...