제출 #1028087

#제출 시각아이디문제언어결과실행 시간메모리
1028087vjudge1Foehn Phenomena (JOI17_foehn_phenomena)C++17
0 / 100
220 ms13384 KiB
#include <bits/stdc++.h>
using namespace std;
 
#define ll long long
#define ld long double
#define pii pair<int, int>
#define pll pair<ll, ll>
#define pld pair<ld, ld>
#define pb push_back
#define fi first
#define se second
#define debug(x) cout << #x << " => " << x << endl
#define all(x) x.begin(),x.end()

int a[200010];
ll tree[800010];

void propagate(int idx,int l,int r)
{
	if(l!=r && tree[idx]!=0)
	{
		tree[idx*2]+=tree[idx];
		tree[idx*2+1]+=tree[idx];
		tree[idx]=0;
	}
}

void build(int idx,int l,int r)
{
	if(l==r)
	{
		tree[idx]=a[l];
		return;
	}

	int mid=(l+r)/2;
	build(idx*2,l,mid);
	build(idx*2+1,mid+1,r);
}

void update(int idx,int l,int r,int x,int y,int v)
{
	if(r<x || y<l) return;
	propagate(idx,l,r);
	if(x<=l && r<=y)
	{
		if(l==r) tree[idx]+=v;
		else tree[idx]=v;
		propagate(idx,l,r);
		return;
	}

	int mid=(l+r)/2;
	update(idx*2,l,mid,x,y,v);
	update(idx*2+1,mid+1,r,x,y,v);
}

ll query(int idx,int l,int r,int x)
{
	if(l==r) return tree[idx];
	propagate(idx,l,r);

	int mid=(l+r)/2;
	if(x<=mid) return query(idx*2,l,mid,x);
	else return query(idx*2+1,mid+1,r,x);
}

int main()
{
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	int n,q,s,t;cin>>n>>q>>s>>t;
	for(int i=0;i<=n;i++) cin>>a[i];
	ll ans=0;
	for(int i=1;i<=n;i++) 
	{
		if(a[i-1]<a[i]) ans-=s*(a[i]-a[i-1]);
		else ans+=t*(a[i-1]-a[i]);
	}
	build(1,1,n);
	while(q--)
	{
		int l,r,x;cin>>l>>r>>x;
		ll v[4];
		if(l==1) v[0]=0;
		else v[0]=query(1,1,n,l-1);
		v[1]=query(1,1,n,l);
		v[2]=query(1,1,n,r);
		if(r==n) v[3]=v[2];
		else v[3]=query(1,1,n,r+1);

		if(v[0]<v[1]) ans+=s*(v[1]-v[0]);
		else ans-=t*(v[0]-v[1]);
		if(v[2]<v[3]) ans+=s*(v[3]-v[2]);
		else ans-=t*(v[2]-v[3]);

		v[1]+=x;
		v[2]+=x;
		if(r==n) v[3]=v[2];

		if(v[0]<v[1]) ans-=s*(v[1]-v[0]);
		else ans+=t*(v[0]-v[1]);
		if(v[2]<v[3]) ans-=s*(v[3]-v[2]);
		else ans+=t*(v[2]-v[3]);

		update(1,1,n,l,r,x);
		cout<<ans<<'\n';
	}
	// debug(ans);
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...