Submission #1214379

#TimeUsernameProblemLanguageResultExecution timeMemory
1214379VMaksimoski008Progression (NOI20_progression)C++20
0 / 100
574 ms1114112 KiB
#include <bits/stdc++.h> #define ar array //#define int long long using namespace std; using ll = long long; using pii = pair<int, int>; using pll = pair<ll, ll>; const int mod = 1e9 + 7; const ll inf = 5e18; const int N = 1e5 + 5; struct node { int tl, tr; ll pref, suf, ans, l, r; node(ll _v=0, int _tl=0, int _tr=0) : tl(_tl), tr(_tr) { pref = suf = ans = 1; l = r = _v; } }; node merge(node a, node b) { if(a.l == -inf) return b; if(b.l == -inf) return a; node res; res.pref = a.pref; res.suf = b.suf; res.tl = a.tl; res.tr = b.tr; res.l = a.l; res.r = b.r; res.ans = max(a.ans, b.ans); if(a.r == b.l) res.ans = max(res.ans, a.suf + b.pref); if(a.pref == a.tr-a.tl+1 && a.r == b.l) res.pref = a.ans + b.pref; if(b.suf == b.tr-b.tl+1 && a.r == b.l) res.suf = a.suf + b.ans; return res; } struct segment_tree { int n; vector<node> tree; vector<ll> lazy; segment_tree(int _n) : n(_n), tree(4*n), lazy(4*n) { build(1, 1, n); } void build(int u, int tl, int tr) { if(tl == tr) { tree[u].l = tree[u].r = 0; tree[u].tl = tl; tree[u].tr = tr; } else { int tm = (tl + tr) / 2; build(2*u, tl, tm); build(2*u+1, tm+1, tr); tree[u] = merge(tree[2*u], tree[2*u+1]); } } void push(int u, int tl, int tr) { if(lazy[u] == 0) return ; tree[u].l += lazy[u]; tree[u].r += lazy[u]; if(tl != tr) { lazy[2*u] += lazy[u]; lazy[2*u+1] += lazy[u]; } lazy[u] = 0; } void update(int u, int tl, int tr, int l, int r, ll v) { push(u, tl, tr); if(tl > r || l > tr) return ; if(l <= tl && tr <= r) { lazy[u] += v; push(u, tl, tr); return ; } int tm = (tl + tr) / 2; update(2*u, tl, tm, l, r, v); update(2*u+1, tm+1, tr, l, r, v); tree[u] = merge( tree[2*u], tree[2*u+1] ); } node query(int u, int tl, int tr, int l, int r) { if(tl > r || l > tr) return node(-inf); push(u, tl, tr); if(l <= tl && tr <= r) return tree[u]; int tm = (tl + tr) / 2; return merge( query(2*u, tl, tm, l, r), query(2*u+1, tm+1, tr, l, r) ); } void update(int l, int r, ll v) { update(1, 1, n, l, r, v); } node query(int l, int r) { return query(1, 1, n, l, r); } }; signed main() { ios_base::sync_with_stdio(false); cout.tie(0); cin.tie(0); int n, q; cin >> n >> q; vector<ll> a(n+1); segment_tree sgt(n-1); for(int i=1; i<=n; i++) { cin >> a[i]; if(i > 1) sgt.update(i-1, i-1, a[i] - a[i-1]); } while(q--) { int t, l, r; cin >> t >> l >> r; if(t == 3) { if(l == r) { cout << 1 << '\n'; continue; } node res = sgt.query(l, r-1); cout << sgt.query(l, r-1).ans + 1 << '\n'; } else if(t == 1) { ll s, c; cin >> s >> c; } else if(t == 2) { ll s, c; cin >> s >> c; } } }
#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...