Submission #201599

#TimeUsernameProblemLanguageResultExecution timeMemory
201599Alexa2001Fire (JOI20_ho_t5)C++17
100 / 100
412 ms35904 KiB
#include <bits/stdc++.h> using namespace std; const int Nmax = 2e5 + 5; typedef long long ll; int n, q; int A[Nmax], Prev[Nmax], Next[Nmax], st[Nmax]; ll ans[Nmax]; struct event { int tip, t, p, w; bool operator < (const event &other) const { return other.t - t < other.p - p; } }; vector<event> ev; struct AIB { ll a[Nmax], b[Nmax]; int ub(int x) { return (x&(-x)); } void upd(ll a[], int pos, ll add) { for(++pos; pos <= n+1; pos += ub(pos)) a[pos] += add; } ll query(ll a[], int pos) { ll ans = 0; assert(0 <= pos && pos <= n); for(++pos; pos; pos -= ub(pos)) ans += a[pos]; return ans; } public: void clear() { memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); } void update(int pos, int w) { upd(a, pos, w); upd(b, pos, -(ll)pos*w + w); } ll query(int pos) { return query(a, pos) * pos + query(b, pos); } } aib; void precalc() { int i, nr = 0; for(i=1; i<=n; ++i) { while(nr && A[st[nr]] < A[i]) --nr; Prev[i] = st[nr]; st[++nr] = i; } nr = 0; for(i=n; i; --i) { while(nr && A[st[nr]] <= A[i]) --nr; Next[i] = st[nr]; st[++nr] = i; } } void solve() { int i; for(i=1; i<=n; ++i) { ev.push_back({0, 0, i, +A[i]}); if(Prev[i]) ev.push_back({0, i - Prev[i], i, -A[i]}); if(Next[i]) ev.push_back({0, Next[i] - i, Next[i], -A[i]}); if(Prev[i] && Next[i]) ev.push_back({0, Next[i] - Prev[i], Next[i], +A[i]}); } for(i=1; i<=q; ++i) { int T, L, R; cin >> T >> L >> R; ev.push_back({1, T, R, i}); ev.push_back({-1, T, L-1, i}); } sort(ev.begin(), ev.end()); aib.clear(); for(auto it : ev) if(it.tip == 0) aib.update(it.t, it.w); else if(it.tip == 1) ans[it.w] += aib.query(it.t); else ans[it.w] -= aib.query(it.t); reverse(ev.begin(), ev.end()); aib.clear(); for(auto it : ev) if(it.tip == 0) aib.update(it.p, it.w); else if(it.tip == 1) ans[it.w] += aib.query(it.p); else ans[it.w] -= aib.query(it.p); } int main() { // freopen("input", "r", stdin); cin.sync_with_stdio(false); cin.tie(0); cin >> n >> q; int i; for(i=1; i<=n; ++i) cin >> A[i]; precalc(); solve(); for(i=1; i<=q; ++i) cout << ans[i] << '\n'; 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...