Submission #1293997

#TimeUsernameProblemLanguageResultExecution timeMemory
1293997hynmjFoehn Phenomena (JOI17_foehn_phenomena)C++20
100 / 100
538 ms13712 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1ll << 18;
int p[N << 3];
int ng[N << 3];
void addp(int i, int val, int cur = 1, int l = 1, int r = N)
{
    if (i < l || i > r)
        return;
    if (l == r)
    {
        p[cur] = val;
        return;
    }
    int lc = cur << 1, rc = lc | 1, mid = (l + r) >> 1;
    addp(i, val, lc, l, mid);
    addp(i, val, rc, mid + 1, r);
    p[cur] = p[lc] + p[rc];
}

void addn(int i, int val, int cur = 1, int l = 1, int r = N)
{
    if (i < l || i > r)
        return;
    if (l == r)
    {
        ng[cur] = val;
        return;
    }
    int lc = cur << 1, rc = lc | 1, mid = (l + r) >> 1;
    addn(i, val, lc, l, mid);
    addn(i, val, rc, mid + 1, r);
    ng[cur] = ng[lc] + ng[rc];
}

int getPos(int L, int R, int cur = 1, int l = 1, int r = N)
{
    if (R < l || L > r)
        return 0;
    if (L <= l && r <= R)
        return p[cur];
    int lc = cur << 1, rc = lc | 1, mid = (l + r) >> 1;
    return getPos(L, R, lc, l, mid) + getPos(L, R, rc, mid + 1, r);
}

int getNeg(int L, int R, int cur = 1, int l = 1, int r = N)
{
    if (R < l || L > r)
        return 0;
    if (L <= l && r <= R)
        return ng[cur];
    int lc = cur << 1, rc = lc | 1, mid = (l + r) >> 1;
    return getNeg(L, R, lc, l, mid) + getNeg(L, R, rc, mid + 1, r);
}

int d[N];
int a[N];
void solve()
{
    int n, q, s, t;
    cin >> n >> q >> s >> t;
    cin >> a[0];
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        d[i] = a[i] - a[i - 1];
        if (d[i] >= 0)
            addp(i, d[i]);
        else
            addn(i, d[i]);
    }
    for (int i = 0; i < q; i++)
    {
        int l, r, x;
        cin >> l >> r >> x;
        d[l] += x;
        if (d[l] >= 0)
        {
            addn(l, 0);
            addp(l, d[l]);
        }
        else
        {
            addp(l, 0);
            addn(l, d[l]);
        }
        if (r != n)
        {
            int idx = r + 1;
            d[idx] -= x;
            if (d[idx] >= 0)
            {
                addn(idx, 0);
                addp(idx, d[idx]);
            }
            else
            {
                addp(idx, 0);
                addn(idx, d[idx]);
            }
        }
        int psum = getPos(1, n);
        int nsum = getNeg(1, n);
        cout << -(psum * s) - (nsum * t) << endl;
        }
}

signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(NULL);
    cout.tie(NULL);
    int t = 1;
    // cin >> t;
    for (int i = 1; i <= t; i++)
    {
        // cout << "Case #" << i << ':' << ' ';
        solve();
        cout << endl;
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...