Submission #498773

#TimeUsernameProblemLanguageResultExecution timeMemory
498773dxz05Hedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++14
77 / 100
1892 ms54748 KiB
#pragma GCC optimize("Ofast,O2,O3,unroll-loops") #pragma GCC target("avx2") #include <bits/stdc++.h> using namespace std; void debug_out() { cerr << endl; } template<typename Head, typename... Tail> void debug_out(Head H, Tail... T) { cerr << "[" << H << "]"; debug_out(T...); } #ifdef dddxxz #define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__) #else #define debug(...) 42 #endif #define SZ(s) ((int)s.size()) #define all(x) (x).begin(), (x).end() #define lla(x) (x).rbegin(), (x).rend() clock_t startTime; double getCurrentTime() { return (double) (clock() - startTime) / CLOCKS_PER_SEC; } #define MP make_pair typedef long long ll; mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count()); const double eps = 0.000001; const int MOD = 998244353; const int INF = 1000000101; const long long LLINF = 1223372000000000555; const int N = 1e6 + 3e2; const int M = 222; inline void merge(vector<int> &v, vector<int> a, vector<int> b){ int n = a.size(), m = b.size(); int i = 0, j = 0; while (i < n || j < m){ if (i < n && (j == m || a[i] < b[j])) v.push_back(a[i++]); else v.push_back(b[j++]); } } struct node{ int ans; int mx; vector<int> vec; node(){ ans = 0; mx = -1; vec.resize(0); }; }; int size = 1; vector<node> tree; inline void build(int v, int tl, int tr, vector<int> &a){ if (tl == tr){ tree[v].ans = 0; tree[v].mx = a[tl - 1]; tree[v].vec = {a[tl - 1]}; return; } int tm = (tl + tr) >> 1; build(v + v, tl, tm, a); build(v + v + 1, tm + 1, tr, a); merge(tree[v].vec, tree[v + v].vec, tree[v + v + 1].vec); tree[v].mx = max(tree[v + v].mx, tree[v + v + 1].mx); tree[v].ans = max(tree[v + v].ans, tree[v + v + 1].ans); int i = lower_bound(all(tree[v + v + 1].vec), tree[v + v].mx) - tree[v + v + 1].vec.begin() - 1; if (i >= 0) tree[v].ans = max(tree[v].ans, tree[v + v].mx + tree[v + v + 1].vec[i]); } inline void init(vector<int> &a){ size = a.size(); tree.resize(4 * size); build(1, 1, size, a); } inline int biggest(int v, int tl, int tr, int l, int r, int key){ if (l <= tl && tr <= r){ int i = lower_bound(all(tree[v].vec), key) - tree[v].vec.begin() - 1; return (i >= 0 ? tree[v].vec[i] : -1); } if (tl > r || tr < l) return -1; int tm = (tl + tr) >> 1; return max(biggest(v + v, tl, tm, l, r, key), biggest(v + v + 1, tm + 1, tr, l, r, key)); } inline pair<int, int> get(int v, int tl, int tr, int l, int r){ if (l <= tl && tr <= r) return MP(tree[v].ans, tree[v].mx); if (tl > r || tr < l) return MP(0, -1); int tm = (tl + tr) >> 1; auto lf = get(v + v, tl, tm, l, r), rg = get(v + v + 1, tm + 1, tr, l, r); int ans = max(lf.first, rg.first); if (lf.first != -1 && rg.first != -1) { int x = biggest(1, 1, size, tm + 1, min(r, tr), lf.second); if (x != -1) ans = max(ans, lf.second + x); } return MP(ans, max(lf.second, rg.second)); } inline int get(int l, int r){ return get(1, 1, size, l, r).first; } int cnt[N]; void solve(int TC) { int n, q; cin >> n >> q; vector<int> a(n); for (int &i : a) cin >> i; if (n <= 2e5) { init(a); while (q--) { int l, r, k; cin >> l >> r >> k; cout << (get(l, r) <= k) << endl; } } else { for (int i = 1; i < n; i++) { cnt[i] = cnt[i - 1] + (a[i] < a[i - 1]); } while (q--) { int l, r, k; cin >> l >> r >> k; cout << (cnt[r - 1] == cnt[l - 1]) << endl; } } } int main() { startTime = clock(); ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); #ifdef dddxxz freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #endif int TC = 1; //cin >> TC; for (int test = 1; test <= TC; test++) { //debug(test); //cout << "Case #" << test << ": "; solve(test); } cerr << endl << "Time: " << int(getCurrentTime() * 1000) << " ms" << 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...