Submission #1288013

#TimeUsernameProblemLanguageResultExecution timeMemory
1288013azamuraiHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++20
0 / 100
3097 ms55776 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define fi first #define se second #define mp make_pair #define pb push_back #define Sz(x) (int)x.size() const int N = 1e6 + 5; const int block = 500; int n, m, a[N], t[N * 4], leftt[N], rightt[N], l[N], r[N], k[N], lastl[N], lastr[N]; void build(int v = 1, int tl = 1, int tr = n) { if (tl == tr) { t[v] = a[tl]; return; } int mid = (tl + tr) / 2; build(v + v, tl, mid); build(v + v + 1, mid + 1, tr); t[v] = max(t[v + v], t[v + v + 1]); } int get(int l, int r, int v = 1, int tl = 1, int tr = n) { if (tl > r || l > tr) return 0; if (tl >= l && tr <= r) return t[v]; int mid = (tl + tr) / 2; return max(get(l, r, v + v, tl, mid), get(l, r, v + v + 1, mid + 1, tr)); } bool compFS(pair<int,pair<int,int>>& p1, pair<int,pair<int,int>>& p2) { return (p1.fi < p2.fi) || (p1.fi == p2.fi && p1.se < p2.se); } void solve() { cin >> n >> m; for (int i = 1; i <= n; i++) { cin >> a[i]; } build(); for (int i = 1; i <= n; i++) { leftt[i] = rightt[i] = -1; lastl[i] = lastr[i] = -1; } for (int i = 1; i <= n; i++) { int l = 1, r = i - 1, best = -1; while (l <= r) { int mid = (l + r) / 2; if (get(mid, i) > a[i]) l = mid + 1, best = mid; else r = mid - 1; } if (best != -1) leftt[i] = best, rightt[best] = i; } vector <pair<int,pair<int,int>>> seg; for (int i = 1; i <= m; i++) { cin >> l[i] >> r[i] >> k[i]; seg.push_back(mp(l[i] / block, mp(r[i], i))); } sort(seg.begin(), seg.end(), compFS); int last_bl = -1, L = 1, R = 0; multiset <int> st; vector <int> ans(m + 1, 0); for (auto to : seg) { int ind = to.se.se; int lq = l[ind], rq = r[ind], kq = k[ind]; if (to.fi != last_bl) { last_bl = to.fi; st.clear(); for (int i = L; i <= R; i++) { lastl[i] = lastr[i] = -1; } L = R = lq; lastl[lq] = lq; lastr[lq] = lq; } while (L > lq) { L--; if (rightt[L] != -1 && lastr[rightt[L]] != -1 && lastr[rightt[L]] != rightt[L]) { int Right = lastr[rightt[L]]; st.erase(st.find(a[rightt[L]] + a[Right])); } if (rightt[L] != -1 && lastr[rightt[L]] != -1) { int Right = lastr[rightt[L]]; lastl[Right] = L; lastr[L] = Right; lastl[L] = L; st.insert(a[L] + a[Right]); } else { lastl[L] = lastr[L] = L; } } while (L < lq) { if (lastr[L] != L) { int Right = lastr[L]; st.erase(st.find(a[Right] + a[L])); lastl[Right] = lastl[rightt[L]] = rightt[L]; if (rightt[L] != Right) { st.insert(a[rightt[L]] + a[Right]); } } lastl[L] = lastr[L] = -1; L++; } while (R < rq) { R++; if (leftt[R] != -1 && lastl[leftt[R]] != -1 && lastl[leftt[R]] != leftt[R]) { int Left = lastl[leftt[R]]; st.erase(st.find(a[leftt[R]] + a[Left])); } if (leftt[R] != -1 && lastl[leftt[R]] != -1) { int Left = lastl[leftt[R]]; lastr[Left] = R; lastl[R] = Left; lastr[R] = R; st.insert(a[R] + a[Left]); } else { lastl[R] = lastr[R] = R; } } while (R > rq) { if (lastl[R] != R) { int Left = lastl[R]; st.erase(st.find(a[Left] + a[R])); lastr[Left] = leftt[R] = leftt[R]; if (leftt[R] != Left) { st.insert(a[leftt[R] + a[Left]]); } } lastl[R] = lastr[R] = -1; R--; } if (Sz(st) == 0 || *st.rbegin() <= kq) { ans[ind] = 1; } } for (int i = 1; i <= m; i++) { cout << ans[i] << '\n'; } } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); int t = 1; //cin >> t; for (int T = 1; T <= t; T++) { solve(); cout << '\n'; } }
#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...