This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 2*1e5 + 10;
ll S,T;
ll magic(ll A,ll B){
if(A < B){
return -S*abs(B - A);
}
else{
return abs(B - A)*T;
}
}
struct node{
ll temperature;
ll ini,fim,lazy;
node() : temperature(0),ini(0),fim(0),lazy(0){}
node operator*(const node& other)const{
node novo;
novo.ini = ini;
novo.fim = other.fim;
novo.lazy = 0;
novo.temperature = temperature + magic(fim,other.ini) + other.temperature;
return novo;
}
};
ll N,Q,vetor[MAXN];
node seg[4*MAXN];
void propagate(int pos,int left,int right){
seg[pos].ini += seg[pos].lazy;
seg[pos].fim += seg[pos].lazy;
if(left != right){
seg[2*pos].lazy += seg[pos].lazy;
seg[2*pos+1].lazy += seg[pos].lazy;
}
seg[pos].lazy = 0;
}
void build(int pos,int left,int right){
if(left == right){
seg[pos].ini = seg[pos].fim = vetor[left];
seg[pos].temperature = seg[pos].lazy = 0;
return;
}
int mid = (left+right)/2;
build(2*pos,left,mid);
build(2*pos+1,mid+1,right);
seg[pos] = seg[2*pos] * seg[2*pos+1];
}
void update(int pos,int left,int right,int i,int j,ll delta){
propagate(pos,left,right);
if(left>right||left>j||right<i) return;
if(left >= i && right <= j){
seg[pos].lazy += delta;
propagate(pos,left,right);
return;
}
int mid = (left+right)/2;
update(2*pos,left,mid,i,j,delta);
update(2*pos+1,mid+1,right,i,j,delta);
seg[pos] = seg[2*pos] * seg[2*pos+1];
}
int main(){
scanf("%lld %lld %lld %lld",&N,&Q,&S,&T);
for(int i = 0;i<=N;i++){
scanf("%lld",&vetor[i]);
}
build(1,0,N);
for(ll q = 1;q<=Q;q++){
ll a,b,delta;
scanf("%lld %lld %lld",&a,&b,&delta);
update(1,0,N,a,b,delta);
printf("%lld\n",seg[1].temperature);
}
return 0;
}
Compilation message (stderr)
foehn_phenomena.cpp: In function 'int main()':
foehn_phenomena.cpp:63:42: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%lld %lld %lld %lld",&N,&Q,&S,&T);
^
foehn_phenomena.cpp:65:26: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%lld",&vetor[i]);
^
foehn_phenomena.cpp:70:39: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%lld %lld %lld",&a,&b,&delta);
^
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |