Submission #1267841

#TimeUsernameProblemLanguageResultExecution timeMemory
1267841usukhbaatarHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++20
0 / 100
1235 ms127488 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;

#define ff first
#define ss second
#define mp make_pair
#define pb push_back
#define heap priority_queue
#define endl '\n'
#define maxx(a, b) a = max(a, b)
#define minn(a, b) a = min(a, b)
#define all(v) v.begin(), v.end()
#define rep(i, n) for (int i = 0; i < n; i++)
#define rep1(i, n) for (int i = 1; i <= n; i++)
#define fastio ios_base::sync_with_stdio(false); cin.tie(NULL);
#define int long long

typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<pii> vii;
typedef vector<vii> vvii;
typedef vector<bool> vb;
typedef vector<vb> vvb;
typedef vector<string> vs;
template <class T> using indexed_set = tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>;

const int mod = 1e9 + 7;
const int oo ((((1LL << 62) - 1) << 1) + 1);
const int dy[] = {-1, 0, 1, 0};
const int dx[] = {0, 1, 0, -1};

int n, q;
vi a;
vector<array<int, 4>> queries;

pii meta(int i) { return {(i << 1) + 1, (i + 1) << 1}; }
tuple<int, int, int> meta(int i, int l, int r) {
	pii m = meta(i); return { m.ff, m.ss, (l + r) / 2 };
}

vi val;

void update(int i, int tl, int tr, int k, int t) {
	if (tl == tr) { val[i] = t; return; }
	auto [x, y, tm] = meta(i, tl,  tr);
	if (k <= tm) update(x, tl, tm, k, t);
	else update(y, tm + 1, tr, k, t);
	val[i] = max(val[x], val[y]);
}

int query(int i, int tl, int tr, int l, int r) {
	if (tl == l && r == tr) return val[i];
	auto [x, y, tm] = meta(i, tl, tr);
	if (r <= tm) return query(x, tl, tm, l, r);
	else if (tm + 1 <= l) return query(y, tm + 1, tr, l, r);
	return max(query(x, tl, tm, l, tm), query(y, tm + 1, tr, tm + 1, r));
}


int32_t main() {
	fastio;
	cin >> n >> q;
	a.resize(n + 1); a[0] = 1e10;
	vi stk = {0};
	rep1(i, n) {
		cin >> a[i];
		while(a[stk.back()] <= a[i]) stk.pop_back();
		if (stk.size() > 1) {
			queries.pb({-a[i] - a[stk.back()], 1, i, stk.back()});
		}
		stk.pb(i);
	}
	vi ans(q);
	vi l(q), r(q);
	rep(i, q) {
		int k;
		cin >> l[i] >> r[i] >> k;
		queries.pb({-k, 0, i, 0});
	}
	sort(all(queries));
	val.resize(4 * n);

	for (auto &qry : queries) {
		//cout << qry[0] << ' ' << qry[1] << ' ' << qry[2] << ' ' << qry[3] << endl;
		if (qry[1] == 1) update(0, 0, n - 1, qry[2] - 1, qry[3]);
		else {
			int id = qry[2];
			ans[id] = (query(0, 0, n - 1, l[id] - 1, r[id] - 1) > l[id] ? 0 : 1);
		}
	}
	for (int x : ans) cout << x << endl;
	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...