Submission #1287995

#TimeUsernameProblemLanguageResultExecution timeMemory
1287995nguynFire (JOI20_ho_t5)C++20
6 / 100
309 ms145140 KiB
#include <bits/stdc++.h> using namespace std; #ifdef LOCAL #include "debug.h" #else #define debug(...) #endif // LOCAL #define ll long long #define F first #define S second #define pb push_back #define pii pair<int, int> const int N = 2e5 + 5; const ll inf = 1e18; struct BIT { int n; int bit[2 * N + 1]; BIT() {} BIT(int n) : n(n) {} void update(int id, ll val) { id += N; for (int i = id; i <= n; i += (i & -i)) bit[i] += val; } ll get(int id) { ll res = 0; id += N; for (int i = id; i > 0; i -= (i & -i)) res += bit[i]; return res; } } bit1(2 * N), bit2(2 * N), bit3(2 * N), bit4(2 * N), bit5(2 * N); struct Query { int l, r, id; }; vector<Query> que[N]; vector<pair<int, ll>> ev1[2 * N], ev2[2 * N], ev3[2 * N], ev4[2 * N], ev5[2 * N]; int n, q; ll res[N]; int a[N], l[N], r[N]; vector<int> vec; ll cal(int t, int r) { return 1ll * (r - t) * (bit1.get(r - t) + bit2.get(r)) + (bit3.get(r - t) + bit4.get(r)) + 1ll * t * bit5.get(r); } void add_tri(int l, int r, int val) { ev1[0].pb({l, val}); ev2[0].pb({r + 1, - val}); ev3[0].pb({l, -1ll * val * (l - 1)}); ev4[0].pb({r + 1, 1ll * val * r}); ev5[0].pb({r + 1, - val}); ev1[r - l + 1].pb({l, - val}); ev2[r - l + 1].pb({r + 1, val}); ev3[r - l + 1].pb({l, 1ll * val * (l - 1)}); ev4[r - l + 1].pb({r + 1, - 1ll * val * r}); ev5[r - l + 1].pb({r + 1, val}); } signed main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> q; for (int i = 1; i <= n; i++) { cin >> a[i]; } for (int i = 1; i <= q; i++) { int t, u, v; cin >> t >> u >> v; que[t].pb({u, v, i}); } for (int i = 1; i <= n; i++) { while(!vec.empty() && a[i] >= a[vec.back()]) vec.pop_back(); if (vec.empty()) l[i] = - n - 2; else l[i] = vec.back(); vec.pb(i); } vec.clear(); for (int i = n; i >= 1; i--) { while(!vec.empty() && a[i] > a[vec.back()]) vec.pop_back(); if (vec.empty()) r[i] = n + 2; else r[i] = vec.back(); vec.pb(i); } for (int i = 1; i <= n; i++) { add_tri(l[i] + 1, r[i] - 1, a[i]); add_tri(l[i] + 1, i - 1, - a[i]); add_tri(i + 1, r[i] - 1, - a[i]); } for (int i = 0; i <= n; i++) { for (auto it : ev1[i]) bit1.update(it.F, it.S); for (auto it : ev2[i]) bit2.update(it.F, it.S); for (auto it : ev3[i]) bit3.update(it.F, it.S); for (auto it : ev4[i]) bit4.update(it.F, it.S); for (auto it : ev5[i]) bit5.update(it.F, it.S); for (auto it : que[i]) { res[it.id] = cal(i, it.r) - cal(i, it.l - 1); } } for (int i = 1; i <= q; i++) { cout << res[i] << '\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...