Submission #1258775

#TimeUsernameProblemLanguageResultExecution timeMemory
1258775sunitFoehn Phenomena (JOI17_foehn_phenomena)C++20
100 / 100
369 ms68312 KiB
#include<bits/stdc++.h>
#define int long long
#define bl bool
#define db double 
#define fl float 
#define st string 
#define pb push_back
#define pf push_front
#define is insert
#define endl "\n"
#define pba pop_back
#define pfr pop_front
#define ub upper_bound
#define lb lower_bound 
#define fi first 
#define se second 
#define FOR(i, l, r, st) for(int i = l; i <= r; i += st)
#define FOS(i, l, r, sl) for(int i = l; i >= r; i -= sl)
#define mii map<int, int>
#define us unordered_set 
#define pii pair<int, int>
#define vt vector
using namespace std;

const int maxn = 1e6 + 5;
const int mod = 1e9 + 7;

struct SEG{
    int seg[4 * maxn], lz[4 * maxn];
    void inp() {
        memset(seg, 0, sizeof(seg));
        memset(lz, 0, sizeof(lz));
    }
    void push(int id, int l, int r) {
        if(lz[id] != 0) {
            seg[id] = seg[id] + lz[id] * (r - l + 1);
            if(l != r) {
                lz[2 * id] += lz[id];
                lz[2 * id + 1] += lz[id];
            }
            lz[id] = 0;
        }
    }
    void up(int id, int l, int r, int lr, int rr, int val) {
        push(id, l, r);
        if(lr > r || rr < l) return;
        if(lr <= l && r <= rr) {
            lz[id] += val;
            push(id, l, r);
            return;
        }
        int mid = (l + r) / 2;
        up(2 * id, l, mid, lr, rr, val);
        up(2 * id + 1, mid + 1, r, lr, rr, val);
        seg[id] = seg[2 * id] + seg[2 * id + 1];
    }
    int get(int id, int l, int r, int pos) {
        push(id, l, r);
        if(l > pos || r < pos) return 0;
        if(l == r) return seg[id];
        int mid = (l + r) / 2;
        if(pos <= mid) return get(2 * id, l, mid, pos);
        else return get(2 * id + 1, mid + 1, r, pos);
    }
} seg;

int n, q, s, t, a[maxn];

int rep(int l, int r) {
    if(l >= r) return ((l - r) * t);
    else return -((r - l) * s);
}

main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    seg.inp();
    cin >> n >> q >> s >> t;
    int res = 0;
    FOR(i, 0, n, 1) cin >> a[i];
    FOR(i, 0, n - 1, 1) res += rep(a[i], a[i + 1]);

    while(q --) {
        int l, r, val; cin >> l >> r >> val;
        int lef1 = a[l - 1] + seg.get(1, 0, n, l - 1);
        int lef2 = a[l] + seg.get(1, 0, n, l);
        res -= rep(lef1, lef2);

        if(r < n) {
            int rit1 = a[r] + seg.get(1, 0, n, r);
            int rit2 = a[r + 1] + seg.get(1, 0, n, r + 1);
            res -= rep(rit1, rit2);
        }

        seg.up(1, 0, n, l, r, val);

        lef1 = a[l - 1] + seg.get(1, 0, n, l - 1);
        lef2 = a[l] + seg.get(1, 0, n, l);
        res += rep(lef1, lef2);

        if(r < n) {
            int rit1 = a[r] + seg.get(1, 0, n, r);
            int rit2 = a[r + 1] + seg.get(1, 0, n, r + 1);
            res += rep(rit1, rit2);
        }

        cout << res << endl;
    }
}

Compilation message (stderr)

foehn_phenomena.cpp:74:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   74 | main() {
      | ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...