제출 #1335899

#제출 시각아이디문제언어결과실행 시간메모리
1335899gohchingjaykHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++20
100 / 100
1187 ms108464 KiB
#pragma GCC optimize("O3,inline")
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
using namespace std;

using ll = long long;

#define int ll

using ii = pair<int, int>;
using iii = pair<ii, int>;

constexpr int INF = 1e18 + 5;
constexpr int MAXN = 1'000'000 + 5;
constexpr int MOD = 1e9 + 7;

struct FST {
	
	FST(int init = 0) {
		fill(vals, vals + MAXN * 2, init);
	}
	
	void point_upd(int p, int v) {
		vals[p += MAXN] = v;
		for (; p > 1; p >>= 1) vals[p >> 1] = max(vals[p], vals[p ^ 1]);
	}
	
	int range_qry(int l, int r) {
		int ans = -INF;
		for (l += MAXN, r += MAXN + 1; l < r; l >>= 1, r >>= 1) {
			if (l & 1) ans = max(ans, vals[l++]);
			if (r & 1) ans = max(ans, vals[--r]);
		}
		return ans;
	}
	
	int vals[MAXN * 2];
};

FST fstIdx(-1);
FST fstAns(0);

signed main() {
	ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
	
	int N, M; cin >> N >> M;
	vector<int> A(N); for (int i = 0; i < N; ++i) cin >> A[i];
	
	vector<int> disc = A; sort(disc.begin(), disc.end());
	for (int i = 0; i < N; ++i) {
		A[i] = lower_bound(disc.begin(), disc.end(), A[i]) - disc.begin();
	}
	
	vector<bool> ans(M);
	vector<vector<iii>> queriesEndingAt(N);
	
	for (int i = 0; i < M; ++i) {
		int l, r, k; cin >> l >> r >> k;
		l--, r--;
		queriesEndingAt[r].emplace_back(ii{l, k}, i);
	}
	
	for (int i = 0; i < N; ++i) {
		int idx = fstIdx.range_qry(A[i] + 1, MAXN - 1);
		if (idx != -1) {
			fstAns.point_upd(idx, disc[A[i]] + disc[A[idx]]);
		}
		fstIdx.point_upd(A[i], i);
		
		for (auto [query, qidx] : queriesEndingAt[i]) {
			auto [l, k] = query;
			ans[qidx] = fstAns.range_qry(l, i) <= k;
			// cout << "queried " << l << " " << i << ", got " << fstAns.range_qry(l, i) << ", k is " << k << '\n';
		}
		
		/*
		cout << "at " << i << '\n';
		for (int j = 0; j <= i; ++j) cout << fstAns.range_qry(j, j) << ' ';
		cout << '\n';
		for (int j = 0; j < N; ++j) cout << fstIdx.range_qry(j, j) << ' ';
		cout << '\n';
		*/
	}
	
	for (int i = 0; i < M; ++i) cout << ans[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...