Submission #1347532

#TimeUsernameProblemLanguageResultExecution timeMemory
1347532jumpFoehn Phenomena (JOI17_foehn_phenomena)C++20
100 / 100
251 ms5736 KiB
#include <bits/stdc++.h>
#define int long long
int n,q,s,t;
int fwk[200010];
void updatefwk(int i,int c){
	while(i>0)fwk[i]+=c,i-=(i&-i);
}
int getValue(int i){
	if(i==0)return 0;
	int sum=0;
	while(i<=n+5)sum+=fwk[i],i+=(i&-i);
	return sum;
}
void update(int l,int r,int change){
	updatefwk(l-1,-change);
	updatefwk(r,change);
}
signed main(){
	std::cin >> n >> q >> s >> t;
	int last=0;
	int lastTemp=0;
	for(int i=0;i<=n;i++){
		int in;
		std::cin >> in;
		update(i+1,i+1,in);
		if(i!=0){
			if(in>last)lastTemp-=s*(in-last);
			else lastTemp+=t*(last-in);
		}
		last = in;
	}
	while(q--){
		int l,r,c;
		std::cin >> l >> r >> c;
		l+=1;
		r+=1;
		int leftV=getValue(l);
		int rightV=getValue(r);
		int edgeLV=getValue(l-1);
		int engeRV=getValue(r+1);
		if(l!=1)
		if(leftV>edgeLV)lastTemp+=s*(leftV-edgeLV);
		else lastTemp-=t*(edgeLV-leftV);
		if(r!=n+1)
		if(engeRV>rightV)lastTemp+=s*(engeRV-rightV);
		else lastTemp-=t*(rightV-engeRV);
		update(l,r,c);
		leftV=getValue(l);
		rightV=getValue(r);
		if(l!=1)
		if(leftV>edgeLV)lastTemp-=s*(leftV-edgeLV);
		else lastTemp+=t*(edgeLV-leftV);
		if(r!=n+1)
		if(engeRV>rightV)lastTemp-=s*(engeRV-rightV);
		else lastTemp+=t*(rightV-engeRV);
		std::cout << lastTemp << '\n';
		//for(int i=1;i<=n+1;i++)std::cout << getValue(i) << ' ';
		//std::cout << '\n';
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...