Submission #1173400

#TimeUsernameProblemLanguageResultExecution timeMemory
1173400LucaIlieFoehn Phenomena (JOI17_foehn_phenomena)C++20
100 / 100
114 ms6468 KiB
#include <bits/stdc++.h>

using namespace std;

struct AIB {
    vector<long long> aib;

    void init( int n ) {
        aib.clear();
        aib.resize( n + 1 );
    }

    void update( int i, int x ) {
        while ( i < aib.size() ) {
            aib[i] += x;
            i += (i & -i);
        }
    }    
    
    long long query( int i ) {
        long long s = 0;
        while ( i > 0 ) {
            s += aib[i];
            i -= (i & -i);
        }
        return s;
    }            
} aib;

const int MAX_N = 2e5;
int h[MAX_N + 1];
int t, s;

long long temp( int i ) {
    long long a = h[i] + aib.query( i );
    long long b = h[i + 1] + aib.query( i + 1 );
    return (long long)(a > b ? t : s) * (a - b);
}


int main() {
    cin.tie( nullptr );
    ios_base::sync_with_stdio( false );
        
    int n, q;
    
    cin >> n >> q >> s >> t;

    for ( int i = 0; i <= n; i++ )
        cin >> h[i];

    aib.init( n + 1 );

    long long ans = 0;
    for ( int i = 0; i < n; i++ )
        ans += temp( i );

    for ( int i = 0; i < q; i++ ) {
        int l, r, k;
        cin >> l >> r >> k;

        ans -= temp( l - 1 );
        if ( r < n )
            ans -= temp( r );

        aib.update( l, +k );
        aib.update( r + 1, -k ); 

        ans += temp( l - 1 );
        if ( r < n )
            ans += temp( r );
        
        cout << ans << "\n";
    }
    
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...