제출 #1242799

#제출 시각아이디문제언어결과실행 시간메모리
1242799ssitaramHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++20
100 / 100
1221 ms63992 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef long double ld;

struct segtree {
	int n;
	vector<int> val;

	segtree(int sz) {
		n = 1;
		while (n < sz) n *= 2;
		val.resize(2 * n - 1);
	}

	void upd(int node, int l, int r, int i, int v) {
		if (r == l + 1) {
			val[node] = v;
			return;
		}
		int m = (l + r) / 2;
		if (i < m) upd(node * 2 + 1, l, m, i, v);
		else upd(node * 2 + 2, m, r, i, v);
		val[node] = max(val[node * 2 + 1], val[node * 2 + 2]);
	}

	void upd(int i, int v) {
		upd(0, 0, n, i, v);
	}

	int mx(int node, int l, int r, int a, int b) {
		if (r <= a || l >= b) return 0;
		if (a <= l && r <= b) return val[node];
		int m = (l + r) / 2;
		return max(mx(node * 2 + 1, l, m, a, b), mx(node * 2 + 2, m, r, a, b));
	}

	int mx(int a, int b) {
		return mx(0, 0, n, a, b);
	}

	int lastg(int node, int l, int r, int i, int v) {
		if (r == l + 1) return (val[node] > v ? l : -1);
		if (l >= i) return -1;
		int m = (l + r) / 2;
		if (val[node * 2 + 2] > v) {
			int ans = lastg(node * 2 + 2, m, r, i, v);
			if (ans != -1) return ans;
		}
		return lastg(node * 2 + 1, l, m, i, v);

	}

	int lastg(int i) {
		return lastg(0, 0, n, i, mx(i, i + 1));
	}
};

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int n, m; cin >> n >> m;
	segtree w(n);
	for (int i = 0; i < n; ++i) {
		int v; cin >> v;
		w.upd(i, v);
	}
	vector<bool> ans(m);
	vector<vector<pair<int, pair<int, int>>>> qs(n);
	for (int i = 0; i < m; ++i) {
		int l, r, w; cin >> l >> r >> w;
		qs[--r].push_back({--l, {w, i}});
	}
	segtree at(n);
	for (int i = 0; i < n; ++i) {
		int j = w.lastg(i);
		if (j != -1) at.upd(j, w.mx(j, j + 1) + w.mx(i, i + 1));
		for (pair<int, pair<int, int>>& j : qs[i]) {
			ans[j.second.second] = (at.mx(j.first, i + 1) <= j.second.first);
		}
	}
	for (int i = 0; i < m; ++i) {
		cout << ans[i] << '\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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...