Submission #571027

#TimeUsernameProblemLanguageResultExecution timeMemory
5710271neFoehn Phenomena (JOI17_foehn_phenomena)C++14
100 / 100
372 ms29064 KiB
#include<bits/stdc++.h>
using namespace std;
struct dataa{
	long long fval = 0,lval = 0,lcount = 0,rcount =0,lazy =0,ans =0;
	void add(long long left,long long right,long long val){
		fval+=val;
		lval+=val;
		lazy+=val; 
		//sum += val *(right - left + 1);
	}
};
long long S,T;
struct Segment_Tree{
	vector<dataa>tree;
	void build(long long node,long long left,long long right,vector<long long>&arr,long long n){
		if (left == right){
			tree[node].fval = arr[left];
			tree[node].lval = arr[left];
			return ;
		}
		long long mid = (left + right)>>1;
		long long z = node + ((mid - left + 1)<<1);
		build(node + 1,left,mid,arr,n);
		build(z,mid + 1,right,arr,n);
		tree[node] = combine(tree[node + 1],tree[z]);
	}
	void init(long long n,vector<long long>&arr){
		tree.resize(2*n - 1);
		build(0,0,n-1,arr,n);
	}
	dataa combine(dataa left,dataa right){
		dataa res;
		res.lval = right.lval;
		res.fval = left.fval;
		res.lcount = left.lcount + right.lcount + (left.lval < right.fval);
		res.rcount = left.rcount + right.rcount + (left.lval >= right.fval);
		res.ans = left.ans + right.ans;
		res.ans -= max(0LL,(right.fval - left.lval)) * S;
		res.ans += max(0LL,(left.lval - right.fval)) * T; 
		return res;
	}
	void push(long long node,long long left,long long right){
		long long mid = (left + right)>>1;
		long long z = node + ((mid - left + 1)<<1);
		if (tree[node].lazy!=0){
			tree[node + 1].add(left,right,tree[node].lazy);
			tree[z].add(left,right,tree[node].lazy);
			tree[node].lazy = 0;
		}
	}
	dataa query(long long node,long long left,long long right,long long qleft,long long qright){
		if (qright<left|| qleft > right)return {0,0,0,0,0};
		if (qleft<=left && qright>=right){
			return tree[node];
		}
		push(node,left,right);
		long long mid = (left + right)>>1;
		long long z = node + ((mid - left + 1)<<1);
		return combine(query(node + 1,left,mid,qleft,qright),query(z,mid + 1,right,qleft,qright));
	}
	void update(long long node,long long left,long long right,long long uleft,long long uright,long long v){
		if (left > uright || right < uleft) return;
		if (uleft <= left && right <=uright){
			tree[node].add(left,right,v);
			return;
		}
		push(node,left,right);
		long long mid = (left + right)>>1;
		long long z = node + ((mid - left + 1)<<1);
		if (uleft<=mid){
			update(node + 1,left,mid,uleft,uright,v);
		}
		if (uright > mid){
			update(z,mid + 1,right,uleft,uright,v);
		}
		tree[node] = combine(tree[node + 1],tree[z]);
	}
};

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	long long n,q;
	cin>>n>>q>>S>>T;
	++n;
	vector<long long>arr(n);
	for (long long i = 0;i<n;++i)cin>>arr[i];
	Segment_Tree st;
	st.init(n,arr);
	for (long long i = 0;i<q;++i){
		long long l,r,x;cin>>l>>r>>x;
		st.update(0,0,n - 1,l,r,x);
		dataa ans = st.query(0,0,n-1,0,n-1);
		cout<<ans.ans<<'\n';
	}
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...