Submission #1124322

#TimeUsernameProblemLanguageResultExecution timeMemory
1124322zhasynHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++20
0 / 100
3097 ms99256 KiB
#include <bits/stdc++.h>
#define pb push_back
#define pf push_front
using namespace std;
#define F first
#define S second
typedef long long ll;
#define pii pair <int, int>
#define pll pair <ll, ll>
typedef long double ld;
const ll N = 1e6 + 100, M = 500 + 10, len = 315, inf = 1e18;
const ll mod = 998244353;
ll um(ll a, ll b){
	return (1LL * a * b) % mod;
}
ll subr(ll a, ll b){
	return ((1LL * a - b) % mod + mod) % mod;
}
ll bp(ll x, ll step){
	ll res = 1;
	while(step){
		if(step & 1) res = um(res, x);
		x = um(x, x);
		step /= 2;
	}
	return res;
}
ll inv(ll x){
	return bp(x, mod - 2);
}
ll arr[N], b[N];
// work with indexes
struct segtree{
	vector <ll> tree, num, ans;
	vector <pair <ll, int>> mx;
	int sz;
	void init(int n){
		sz = 1;
		while(sz < n) sz *= 2;
		tree.assign(2 * sz - 1, LLONG_MAX);
		num.assign(2 * sz - 1, 0LL);
		ans.assign(2 * sz - 1, 0LL);
		mx.assign(2 * sz - 1, {0LL, 0});
	}
	void upd(int v, int i, int x, int lx, int rx, int code){
		if(rx - lx == 1){
			if(code == 1) tree[x] = v;
			if(code == 2) num[x] = v;
			if(code == 3) ans[x] = v;
			if(code == 4) mx[x] = {v, i};
			return;
		}
		int mid = (rx + lx) / 2;
		if(i < mid) upd(v, i, 2 * x + 1, lx, mid, code);
		else upd(v, i, 2 * x + 2, mid, rx, code);
		if(code == 1) tree[x] = min(tree[2 * x + 1], tree[2 * x + 2]);
		if(code == 2) num[x] = max(num[2 * x + 1], num[2 * x + 2]);
		if(code == 3) ans[x] = max(ans[2 * x + 1], ans[2 * x + 2]);
		if(code == 4){
			if(mx[2 * x + 2].F >= mx[2 * x + 1].F) mx[x] = mx[2 * x + 2];
			else mx[x] = mx[2 * x + 1];
		}
	}
	void upd(int v, int i, int code){
		upd(v, i, 0, 0, sz, code);
	}
	
	pair <ll, int> getp(int l, int r, int x, int lx, int rx){
		if(lx >= r || l >= rx){
			return {0LL, 0LL};
		}
		if(l <= lx && rx <= r){
			return mx[x];
		}
		int mid = (rx + lx) / 2;
		pair <ll, int> s1 = getp(l, r, 2 * x + 1, lx, mid);
		pair <ll, int> s2 = getp(l, r, 2 * x + 2, mid, rx);
		if(s2.F >= s1.F) return s2;
		else return s1;
	}
	pair <ll, int> getp(int l, int r){
		return getp(l, r, 0, 0, sz);
	}
	
	ll get(int l, int r, int x, int lx, int rx, int code){
		if(lx >= r || l >= rx){
			if(code == 1) return LLONG_MAX;
			if(code == 2) return 0LL;
			if(code == 3) return 0LL;
		}
		if(l <= lx && rx <= r){
			if(code == 1) return tree[x];
			if(code == 2) return num[x];
			if(code == 3) return ans[x];
		}
		int mid = (rx + lx) / 2;
		ll s1 = get(l, r, 2 * x + 1, lx, mid, code);
		ll s2 = get(l, r, 2 * x + 2, mid, rx, code);
		if(code == 1) return min(s1, s2);
		if(code == 2) return max(s1, s2);
		return max(s1, s2);
	}
	ll get(int l, int r, int code){
		return get(l, r, 0, 0, sz, code);
	}
	ll get_mx(int l, int code){
		return get(l, sz, 0, 0, sz, code);
	}
};
int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	int n, d;
	cin >> n >> d;
	for(int i = 0; i < n; i++){
		cin >> arr[i];
		b[i] = arr[i];
	}
	sort(b, b + n);
	int sz = unique(b, b + n) - b;
	segtree obj;
	obj.init(n + 10);
	
	for(int i = 0; i < n; i++){
		arr[i] = lower_bound(b, b + sz, arr[i]) - b;
		obj.upd(arr[i], i, 2);
		obj.upd(arr[i], i, 4);
	}
	
	
	for(int i = n - 1; i >= 0; i--){
		if(i != n - 1){
			ll res = obj.get_mx(arr[i], 1);
			if(res == LLONG_MAX) obj.upd(b[arr[i]] + b[obj.get_mx(i + 1, 2)], i, 3);
			else{
				if(res == i + 1) obj.upd(0LL, i, 3);
				else obj.upd(b[arr[i]] + b[obj.get(i + 1, res, 2)], i, 3);
			}
		}
		obj.upd(i, arr[i], 1);
	}
	for(int i = 0, l, r, k; i < d; i++){
		cin >> l >> r >> k;
		l--;
		pair <ll, int> pos = obj.getp(l, r);
		ll res1 = obj.get(l, pos.S, 3), res2;
		
		if(pos.S == r - 1) res2 = 0;
		else res2 = b[pos.F] + obj.get(pos.S + 1, r, 2);
		//cout << res1 << " "<< res2 << endl;
		if(max(res1, res2) > k) cout << 0 << endl;
		else cout << 1 << 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...