이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
typedef long long lld;
const int MX=200010, inf=2e9;
int n, q, s, t;
lld now;
lld tree[MX];
void upt(int r, int val){
for(; r>0; r-=r&(-r))
tree[r]+=val;
}
void upt(int l, int r, int x){
upt(r,x); upt(l-1, -x);
}
lld val(int pos){
lld ans=0;
for(; 0<pos && pos<=n; pos+=pos&(-pos))
ans+=tree[pos];
return ans;
}
inline lld f(lld a, lld b){
return (a-b) * (a>b ? t : s);
}
void debug(){
return;
cout<<"DEBUG!!\n";
for(int i=1; i<=n; i++) cout<<val(i)<<' ';
cout<<'\n';
}
int main(){
ios::sync_with_stdio(0); cin.tie(0);
cin>>n>>q>>s>>t;
for(int i=0; i<=n; i++){
int h; cin>>h;
upt(i,i,h);
lld prv=val(i-1);
now += f(prv, h);
debug();
}
for(int i=1; i<=q; i++){
int l, r, x;
cin>>l>>r>>x;
lld ll = val(l-1), rr = val(r+1);
lld lr1 = val(l), rl1 = val(r);
upt(l,r,x);
lld lr2 = val(l), rl2 = val(r);
if(r<n) now += f(rl2, rr) - f(rl1, rr);
now += f(ll, lr2) - f(ll, lr1);
cout<<now<<'\n';
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |