이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 2000005;
ll n, q, s, t, a[N], b[N], st[N], lz[N], k;
int bld(int nd, int l, int r){
if(l == r) return st[nd] = a[l];
int md = (l + r) / 2;
return st[nd] = bld(nd*2,l,md) + bld(nd*2+1,md+1,r);
}
int upd(int nd, int l, int r, int x, int y, int vl){
st[nd] += ((r-l+1) * lz[nd]);
lz[nd*2] += lz[nd];
lz[nd*2+1] += lz[nd];
lz[nd] = 0;
if(l > y or r < x) return st[nd];
if(l >= x and r <= y){
lz[nd] += vl;
st[nd] += ((r-l+1) * lz[nd]);
lz[nd*2] += lz[nd];
lz[nd*2+1] += lz[nd];
lz[nd] = 0;
return st[nd];
}
int md = (l + r) / 2;
return st[nd] = upd(nd*2, l, md, x, y, vl) + upd(nd*2+1, md+1, r, x, y, vl);
}
int fnd(int nd, int l, int r, int ind){
st[nd] += ((r-l+1) * lz[nd]);
lz[nd*2] += lz[nd];
lz[nd*2+1] += lz[nd];
lz[nd] = 0;
if(l > ind or r < ind) return st[nd];
if(l == r){
k = st[nd];
return st[nd];
}
int md = (l + r) / 2;
return st[nd] = fnd(nd*2, l, md, ind) + fnd(nd*2+1, md+1, r, ind);
}
int main(){
ios::sync_with_stdio(false); cin.tie(0);
cin >> n >> q >> s >> t;
for(int i = 1; i <= n+1; i++){
cin >> a[i];
}
bld(1,1,n+1);
ll ans = 0;
for(int i = 1; i <= n; i++){
if(a[i] < a[i+1]) b[i] = -s;
else b[i] = t;
b[i] *= (abs(a[i]-a[i+1]));
ans += b[i];
}
for(int i = 1; i <= q; i++){
ll l, r, x;
cin >> l >> r >> x;
l++;
r++;
upd(1,1,n+1,l,r,x);
ans -= b[l-1];
ans -= b[r];
fnd(1,1,n+1,l-1);
ll al1 = k;
fnd(1,1,n+1,l);
ll al = k;
fnd(1,1,n+1,r);
ll ar = k;
fnd(1,1,n+1,r+1);
ll ar1 = k;
if(al1 < al) b[l-1] = -s;
else b[l-1] = t;
b[l-1] *= (abs(al-al1));
ans += b[l-1];
if(r <= n){
if(ar < ar1) b[r] = -s;
else b[r] = t;
b[r] *= (abs(ar-ar1));
ans += b[r];
}
cout << ans << '\n';
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |