제출 #245270

#제출 시각아이디문제언어결과실행 시간메모리
245270YeraHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++17
64 / 100
551 ms60584 KiB
// In The Name Of God
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math,O3")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <iostream>
#include <iomanip>
#include <fstream>
#include <vector>
#include <set>
#include <map>
#include <cstring>
#include <string>
#include <bitset>
#include <cmath>
#include <cassert>
#include <ctime>
#include <algorithm>
#include <sstream>
#include <list>
#include <queue>
#include <deque>
#include <stack>
#include <cstdlib>
#include <cstdio>
#include <iterator>
#include <functional>
#include <unordered_set>
#include <unordered_map>
using namespace std;
using ll = long long;
using ld = long double;
using ull = unsigned long long;

#define f first
#define s second
#define pb push_back
#define mp make_pair
#define sagyndym_seni ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()

const ll N = 2e5+5, p1 = 911382323, p2 = 972663749, mod = 1e9+123;

inline int read(){
	char c = getchar_unlocked();
	bool minus = 0;
	while (c < '0' || '9' < c){
		if(c == '-'){ minus = 1;}
		c = getchar_unlocked();
		if(c == '-'){ minus = 1;}
	}
	int res = 0;
	while ('0' <= c && c <= '9') {
		res = (res << 3) + (res << 1) + c - '0';
		c = getchar_unlocked();
	}
	if(minus){ res *= -1;}
	return res;
}

struct node{
	int max_val, max_inv;
	vector<int> v;
	bool operator == (const node& B) const{
		return (max_val == B.max_val);
	}
};

int n, m;
vector<int> a;
node t[N << 2], badAss;

void build(int v, int vl, int vr){
	if(vl == vr){
		t[v].max_val = a[vl];
		t[v].max_inv = 0;
		t[v].v = vector<int> (1, a[vl]);
		return;
	}
	int vm = (vl + vr) >> 1;
	build(v*2+1, vl, vm);
	build(v*2+2, vm+1, vr);
	t[v].max_val = max(t[v*2+1].max_val, t[v*2+2].max_val);
	t[v].max_inv = max(t[v*2+1].max_inv, t[v*2+2].max_inv);
	merge(all(t[v*2+1].v), all(t[v*2+2].v), back_inserter(t[v].v));
	if(t[v*2+1].max_val > t[v*2+2].v[0]){
		t[v].max_inv = max(t[v].max_inv, *(--lower_bound(all(t[v*2+2].v), t[v*2+1].max_val)) + t[v*2+1].max_val);
	}
}

//{max_val, max_inv}
pair<int, int> query(int v, int vl, int vr, int l, int r, int max_left){
	if(vl > r || vr < l){ return {-1, 0};}
	if(l <= vl && vr <= r){
		pair<int, int> res = {t[v].max_val, t[v].max_inv};
		if(max_left > t[v].v[0]){
			res.s = *(--lower_bound(all(t[v].v), max_left)) + max_left;
		}
		res.s = max(res.s, t[v].max_inv);
		res.f = max(res.f, max_left);
		return res;
	}
	int vm = (vl + vr) >> 1;
	pair<int, int> q1 = query(v*2+1, vl, vm, l, r, max_left);
	pair<int, int> q2 = query(v*2+2, vm+1, vr, l, r, max(max_left, q1.f));
	return {max(max(q1.f, q2.f), max_left), max(q1.s, q2.s)};
}

int main(){
	sagyndym_seni;
	badAss.max_val = -1;
	badAss.max_inv = -1;
	badAss.v = vector<int>(1, -1);
	
	n = read(); m = read();
	a.resize(n);
	for(int i = 0; i < n; i++){
		a[i] = read();
	}
	build(0, 0, n - 1);
	while(m--){
		int l = read()-1, r = read()-1, k = read();
		pair<int, int> res = query(0, 0, n-1, l, r, -1);
		res.s <= k ? putchar_unlocked('1') : putchar_unlocked('0');
		putchar_unlocked('\n');
	}
	return 0;
}
/* TIMUS: 292220YC*/


#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...