Submission #1276985

#TimeUsernameProblemLanguageResultExecution timeMemory
1276985kaiboyFire (JOI20_ho_t5)C++20
100 / 100
682 ms45292 KiB
// coached by rainboy #include <algorithm> #include <iostream> using namespace std; const int N = 200000; const int Q = 200000; const int N_ = 1 << 18; int aa[N], qu[N], pp[N], qq[N]; int tt_[Q], ll_[Q], rr_[Q], zz[Q]; long long xx[Q]; int tt[N * 7], ll[N * 7], rr[N * 7], bb[N * 7], hh[N * 7]; long long st[2][N_ << 1], lz[2][N_]; int sz[N_ << 1], h_, n_; void put(int z, int i, long long a) { st[z][i] += a * sz[i]; if (i < n_) lz[z][i] += a; } void pus(int z, int i) { if (lz[z][i]) { int l = i << 1, r = l ^ 1; put(z, l, lz[z][i]); put(z, r, lz[z][i]); lz[z][i] = 0; } } void pul(int z, int i) { if (!lz[z][i]) { int l = i << 1, r = l ^ 1; st[z][i] = st[z][l] + st[z][r]; } } void push(int z, int i) { for (int h = h_; h; h--) pus(z, i >> h); } void pull(int z, int i) { while (i >>= 1) pul(z, i); } void build(int n) { for (h_ = 0, n_ = 1; n_ < n; h_++, n_ <<= 1) ; for (int i = 0; i < n_; i++) sz[i + n_] = 1; for (int i = n_ - 1; i; i--) sz[i] = sz[i << 1] << 1; } void update(int z, int l, int r, int a) { int l_ = l += n_, r_ = r += n_; push(z, l_), push(z, r_); for ( ; l <= r; l >>= 1, r >>= 1) { if (l & 1) put(z, l++, a); if (!(r & 1)) put(z, r--, a); } pull(z, l_), pull(z, r_); } long long query(int z, int l, int r) { long long a = 0; push(z, l += n_), push(z, r += n_); for ( ; l <= r; l >>= 1, r >>= 1) { if (l & 1) a += st[z][l++]; if (!(r & 1)) a += st[z][r--]; } return a; } int main() { ios_base::sync_with_stdio(false), cin.tie(NULL); int n, q; cin >> n >> q; for (int i = 0; i < n; i++) cin >> aa[i]; for (int z = 0; z < q; z++) cin >> tt_[z] >> ll_[z] >> rr_[z], ll_[z]--, rr_[z]--, zz[z] = z; sort(zz, zz + q, [] (int z0, int z1) { return tt_[z0] < tt_[z1]; }); for (int cnt = 0, i = 0; i < n; i++) { while (cnt && aa[qu[cnt - 1]] <= aa[i]) cnt--; pp[i] = cnt ? qu[cnt - 1] : -1, qu[cnt++] = i; } for (int cnt = 0, i = n - 1; i >= 0; i--) { while (cnt && aa[qu[cnt - 1]] < aa[i]) cnt--; qq[i] = cnt ? qu[cnt - 1] : n, qu[cnt++] = i; } int m = 0; build(n); for (int i = 0; i < n; i++) { int a = aa[i], p = pp[i], q = qq[i]; update(0, i, q - 1, a); if (p != -1) { tt[m] = q - p - 1, ll[m] = i, rr[m] = q - 1, bb[m] = -a, hh[m] = m, m++; tt[m] = i - p, ll[m] = -1, rr[m] = p, bb[m] = -a, hh[m] = m, m++; tt[m] = q - p - 1, ll[m] = -1, rr[m] = p, bb[m] = a, hh[m] = m, m++; tt[m] = i - p, ll[m] = 0, rr[m] = i - 1, bb[m] = a, hh[m] = m, m++; tt[m] = q - p - 1, ll[m] = 0, rr[m] = i - 1, bb[m] = -a, hh[m] = m, m++; } if (i + 1 < q) { update(1, i + 1, n - 1, -a); tt[m] = q - i - 1, ll[m] = i + 1, rr[m] = -1, bb[m] = a, hh[m] = m, m++; if (q < n) { update(0, q, n - 1, a); tt[m] = q - i - 1, ll[m] = q, rr[m] = n - 1, bb[m] = -a, hh[m] = m, m++; } } } sort(hh, hh + m, [] (int h0, int h1) { return tt[h0] < tt[h1]; }); long long s = 0; for (int g = 0, y = 0; y < q; y++) { int z = zz[y], t_ = tt_[z], l_ = ll_[z], r_ = rr_[z]; for (int h; g < m && tt[h = hh[g]] <= t_; g++) { int l = ll[h], r = rr[h], a = bb[h]; if (l == -1) update(1, 0, r, a), s += a; else if (r == -1) update(1, l, n - 1, a); else update(0, l, r, a); } xx[z] = query(0, l_, r_); if (r_ < t_) xx[z] += s * (r_ - l_ + 1); else if (l_ < t_) xx[z] += s * (t_ - l_) + query(1, 0, r_ - t_); else xx[z] += query(1, l_ - t_, r_ - t_); } for (int z = 0; z < q; z++) cout << xx[z] << '\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...