Submission #524440

#TimeUsernameProblemLanguageResultExecution timeMemory
524440AA_SurelyHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++14
100 / 100
1125 ms71624 KiB
#include <bits/stdc++.h> #define FOR(i,x,n) for(int i=x; i<n; i++) #define F0R(i,n) FOR(i,0,n) #define ROF(i,x,n) for(int i=n-1; i>=x; i--) #define R0F(i,n) ROF(i,0,n) #define WTF cout << "WTF" << endl #define IOS ios::sync_with_stdio(false); cin.tie(0) #define F first #define S second #define pb push_back #define ALL(x) x.begin(), x.end() #define RALL(x) x.rbegin(), x.rend() using namespace std; typedef long long LL; typedef pair<int, int> PII; typedef pair<LL, LL> PLL; typedef vector<int> VI; typedef vector<LL> VLL; typedef vector<PII> VPII; typedef vector<PLL> VPLL; const int MAXN = 1e6 + 7; const int ALPHA = 27; const int INF = 1e9 + 7; const int MOD = 1e9 + 7; const int LOG = 22; struct Query { int lo, hi, k; int id; inline bool operator < (const Query other) { return hi < other.hi; } } qs[MAXN]; int n, q; int ns[MAXN], agh[MAXN]; int tree[MAXN << 2], ans[MAXN]; int get(int lq, int rq, int now_on = 1, int ls = 0, int rs = n - 1) { if (rq < lq || rq < ls || rs < lq) return -INF; if (lq <= ls && rs <= rq) return tree[now_on]; int mid = (ls + rs) >> 1; return max(get(lq, rq, now_on << 1, ls, mid), get(lq, rq, now_on << 1 | 1, mid + 1, rs)); } void change(int id, int val, int now_on = 1, int ls = 0, int rs = n - 1) { if (ls == rs) { tree[now_on] = val; return; } int mid = (ls + rs) >> 1; if (id <= mid) change(id, val, now_on << 1, ls, mid); else change(id, val, now_on << 1 | 1, mid + 1, rs); tree[now_on] = max(tree[now_on << 1], tree[now_on << 1 | 1]); return; } int main() { IOS; cin >> n >> q; F0R(i, n) cin >> ns[i]; stack<int> keep; F0R(i, n) { while(!keep.empty() && ns[keep.top()] <= ns[i]) keep.pop(); if (keep.empty()) agh[i] = -1; else agh[i] = keep.top(); keep.push(i); } /* F0R(i, n) cout << agh[i] << ' '; cout << endl; */ F0R(i, q) { cin >> qs[i].lo >> qs[i].hi >> qs[i].k; qs[i].lo--; qs[i].hi--; qs[i].id = i; } sort(qs, qs + q); int ptr = 0; F0R(i, n) { if (agh[i] != -1) { //cout << "for i = " << i << " changing " << agh[i] << " to " << ns[ agh[i] ] + ns[i] << endl; change(agh[i], ns[ agh[i] ] + ns[i]); } while(ptr < q && qs[ptr].hi <= i) { ans[ qs[ptr].id ] = (get(qs[ptr].lo, qs[ptr].hi) <= qs[ptr].k); ptr++; } } #define endl '\n' F0R(i, q) cout << ans[i] << endl; }
#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...