제출 #1335979

#제출 시각아이디문제언어결과실행 시간메모리
1335979gelastropodHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++20
0 / 100
1334 ms227436 KiB
#pragma GCC optimize("O3,inline")
#include <bits/stdc++.h>
using namespace std;

vector<int> W, die;

struct node {
	int s, e, m, v1, v2;
	node* l, * r;

	node(int _s, int _e) : s(_s), e(_e), m((_s + _e) / 2), v1(INT_MAX), v2(0) {
		if (s != e)
			l = new node(s, m), r = new node(m + 1, e);
	}

	void upd1(int n, int x) {
		if (s == e) {
			v1 = x;
			return;
		}
		if (n <= m) l->upd1(n, x);
		else r->upd1(n, x);
		v1 = min(l->v1, r->v1);
	}

	void upd2(int n, int x) {
		if (s == e) {
			v2 = x;
			return;
		}
		if (n <= m) l->upd2(n, x);
		else r->upd2(n, x);
		v2 = max(l->v2, r->v2);
	}

	int qry1(int a, int b) {
		if (b < s || a > e) return INT_MAX;
		if (a <= s && b >= e) return v1;
		return min(l->qry1(a, b), r->qry1(a, b));
	}

	int qry2(int a, int b) {
		if (b < s || a > e) return 0;
		if (a <= s && b >= e) return v2;
		return max(l->qry2(a, b), r->qry2(a, b));
	}
} *root;

signed main() {
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	int N, M, a, b, c; cin >> N >> M;
	vector<int> u, rg(N, INT_MAX);
	for (int i = 0; i < N; i++) {
		cin >> a;
		W.push_back(a);
		u.push_back(a);
		if (i > 0 && W[i] < W[i - 1]) die.push_back(i - 1);
	}
	u.erase(unique(u.begin(), u.end()), u.end());
	root = new node(0, N - 1);
	for (int i = N - 1; i >= 0; i--) {
		int crnt = lower_bound(u.begin(), u.end(), W[i]) - u.begin();
		rg[i] = root->qry1(crnt + 1, N - 1);
		root->upd1(crnt, i);
	}
	vector<int> nn;
	for (int i = 0; i < N; i++) nn.push_back(lower_bound(u.begin(), u.end(), W[i]) - u.begin());
	root = new node(0, N - 1);
	vector<pair<pair<int, int>, pair<int, int>>> quers;
	vector<int> died(M, 0);
	for (int i = 0; i < M; i++) {
		cin >> a >> b >> c; a--, b--;
		quers.push_back({ {a, b}, {c, i} });
	}
	sort(quers.begin(), quers.end(), greater<pair<pair<int, int>, pair<int, int>>>());
	int crnti = N;
	stack<int> stk;
	for (int i = 0; i < M; i++) {
		while (crnti > quers[i].first.first) {
			crnti--;
			int crntmax = 0;
			while (stk.size() && stk.top() <= W[crnti]) {
				crntmax = max(crntmax, stk.top() + W[crnti]);
				stk.pop();
			}
			stk.push(W[crnti]);
			root->upd2(crnti, crntmax);
		}
		if (root->qry2(quers[i].first.first, quers[i].first.second) <= quers[i].second.first) died[quers[i].second.second] = 1;
	}
	for (int i : died) cout << 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...