Submission #1320774

#TimeUsernameProblemLanguageResultExecution timeMemory
1320774tkm_algorithmsFoehn Phenomena (JOI17_foehn_phenomena)C++20
100 / 100
265 ms15528 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
#define int ll
using P = pair<int, int>;
#define all(x) x.begin(), x.end()
#define rep(i, l, n) for (int i = l; i < (n); ++i)
#define sz(x) (int)x.size()
const char nl = '\n';
const int mod = 1e9+7;

struct arr{
	vector<int> tree;
	int size;
	
	void init(int n) {
		size = 1;
		while (size < n)size <<= 1;
		tree.assign(2*size-1, 0);
	}
	
	void gos(int i, int v, int x, int lx, int rx) {
		if (rx-lx == 1) {
			tree[x] += v;
			return;
		}
		int mid = lx+rx>>1;
		if(i<mid)gos(i, v, 2*x+1, lx, mid);
		else gos(i, v, 2*x+2, mid, rx);
		tree[x] = tree[2*x+1]+tree[2*x+2];
	}
	
	void gos(int i, int v) {
		gos(i, v, 0, 0, size);
	}
	
	int get(int r, int x, int lx, int rx) {
		if (lx >= r)return 0;
		if (rx <= r)return tree[x];
		int mid = lx+rx>>1;
		return get(r, 2*x+1, lx, mid)+get(r, 2*x+2, mid, rx);
	}
	
	int get(int r) {
		return get(r, 0, 0, size);
	}
};

struct segtree{
	vector<int> tree;
	int size;
	
	void init(int n) {
		size = 1;
		while (size < n)size <<= 1;
		tree.assign(2*size-1, 0);
	}
	
	void gos(int i, int v, int x, int lx, int rx) {
		if (rx-lx==1) {
			tree[x] += v;
			return;
		}
		
		int mid = lx+rx>>1;
		if(i<mid)gos(i, v, 2*x+1, lx, mid);
		else gos(i, v, 2*x+2, mid, rx);
		tree[x] = tree[2*x+1]+tree[2*x+2];
	}
	
	void gos(int i, int v) {
		gos(i, v, 0, 0, size);
	}
};

int n, q, s, t;

int f(int a, int b) {
	if (a >= b)return (a-b)*t;
	return (a-b)*s;
}

void solve() {
	cin >> n >> q >> s >> t;
	vector<int> a(n+1), b(n+1);
	for (auto &i: a)cin >> i;

	arr U;
	U.init(n+5);
	
	segtree st;
	st.init(n+5);
	
	rep(i, 1, n+1)
		st.gos(i, f(a[i-1], a[i]));
	
	rep(i, 0, q) {
		int l, r, x; cin >> l >> r >> x;
		b[l-1] = a[l-1]+U.get(l), b[l] = a[l]+U.get(l+1);
		b[r] = a[r]+U.get(r+1); if (r+1 <= n)b[r+1] = a[r+1]+U.get(r+2);
		int cur = st.tree[0]-f(b[l-1], b[l])-(r+1<=n?f(b[r], b[r+1]): 0ll);
		st.gos(l, -f(b[l-1], b[l]));
		if (r+1 <= n)st.gos(r+1, -f(b[r], b[r+1]));
		//if (i == 1)cout << "!!" <<b[r] + x<< nl;
		U.gos(l, x), U.gos(r+1, -x); b[l] += x;
		if (r != l)b[r] += x;
		//if (i == 1)cout << "!!" << b[r] << nl;
		st.gos(l, +f(b[l-1], b[l]));
		if (r+1 <= n)st.gos(r+1, +f(b[r], b[r+1]));
		cur += f(b[l-1], b[l])+(r+1<=n?f(b[r], b[r+1]): 0ll);
		//if (i == 1)cout << "!!" <<b[r]<< nl;
		cout << cur << nl;
		b[l] = b[l+1] = b[r] = 0;
		if (r+1<=n)b[r+1] = 0;
	}
}

int32_t main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    solve();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...