Submission #254966

#TimeUsernameProblemLanguageResultExecution timeMemory
254966imeimi2000Fire (JOI20_ho_t5)C++17
100 / 100
643 ms47176 KiB
#include <bits/stdc++.h>
#define fs first
#define se second

using namespace std;
typedef long long llong;
typedef pair<int, int> pii;

struct fenwick {
    static const int N = 200005;
    llong fen[N + N + 5];
    void init() {
        memset(fen, 0, sizeof(fen));
    }
    void update(int i, llong x) {
        i += N;
        while (i <= N + N) {
            fen[i] += x;
            i += i & -i;
        }
    }
    llong query(int i) const {
        i += N;
        llong ret = 0;
        while (i) {
            ret += fen[i];
            i -= i & -i;
        }
        return ret;
    }
} fen1, fen2;

int n, q;
int S[200001];
pii seg[1 << 19];

void init(int i, int s, int e) {
    if (s == e) {
        seg[i] = pii(S[s], s);
        return;
    }
    int m = (s + e) / 2;
    init(i + i, s, m);
    init(i + i + 1, m + 1, e);
    seg[i] = max(seg[i + i], seg[i + i + 1]);
}

pii query(int i, int s, int e, int x, int y) {
    if (e < x || y < s) return pii(0, 0);
    if (x <= s && e <= y) return seg[i];
    int m = (s + e) / 2;
    return max(query(i + i, s, m, x, y), query(i + i + 1, m + 1, e, x, y));
}

vector<pair<pii, int>> U;
void solve(int s, int e) {
    if (s > e) return;
    int m = query(1, 1, n, s, e).se;
    if (s > 1) {
        U.emplace_back(pii(m, m - s + 1), -S[m]);
        U.emplace_back(pii(e + 1, e - s + 2), S[m]);
    }
    {
        U.emplace_back(pii(m, 0), S[m]);
        U.emplace_back(pii(e + 1, e - m + 1), -S[m]);
    }
    solve(s, m - 1);
    solve(m + 1, e);
}

llong ans[200001];

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin >> n >> q;
    for (int i = 1; i <= n; ++i) cin >> S[i];
    init(1, 1, n);
    solve(1, n);
    vector<pair<pii, int>> Q;
    for (int i = 1; i <= q; ++i) {
        int t, l, r;
        cin >> t >> l >> r;
        Q.emplace_back(pii(r, t), i);
        Q.emplace_back(pii(l - 1, t), -i);
    }
    for (int it = 0; it < 2; ++it) {
        sort(U.begin(), U.end());
        sort(Q.begin(), Q.end());
        fen1.init();
        fen2.init();
        for (int i = 0, j = 0; i < int(Q.size()); ++i) {
            while (j < int(U.size()) && U[j].fs.fs <= Q[i].fs.fs) {
                int jx = U[j].fs.se - U[j].fs.fs;
                fen1.update(jx, U[j].se);
                fen2.update(jx, U[j].se * (1ll - U[j].fs.fs));
                ++j;
            }
            int ix = Q[i].fs.se - Q[i].fs.fs - it;
            llong val = fen1.query(ix) * Q[i].fs.fs + fen2.query(ix);
            if (Q[i].se < 0) ans[-Q[i].se] -= val;
            else ans[Q[i].se] += val;
        }
        for (auto &i : U) swap(i.fs.fs, i.fs.se);
        for (auto &i : Q) swap(i.fs.fs, i.fs.se);
    }
    for (int i = 1; i <= q; ++i) printf("%lld\n", ans[i]);
    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...