Submission #571027

#TimeUsernameProblemLanguageResultExecution timeMemory
5710271neFoehn Phenomena (JOI17_foehn_phenomena)C++14
100 / 100
372 ms29064 KiB
#include<bits/stdc++.h> using namespace std; struct dataa{ long long fval = 0,lval = 0,lcount = 0,rcount =0,lazy =0,ans =0; void add(long long left,long long right,long long val){ fval+=val; lval+=val; lazy+=val; //sum += val *(right - left + 1); } }; long long S,T; struct Segment_Tree{ vector<dataa>tree; void build(long long node,long long left,long long right,vector<long long>&arr,long long n){ if (left == right){ tree[node].fval = arr[left]; tree[node].lval = arr[left]; return ; } long long mid = (left + right)>>1; long long z = node + ((mid - left + 1)<<1); build(node + 1,left,mid,arr,n); build(z,mid + 1,right,arr,n); tree[node] = combine(tree[node + 1],tree[z]); } void init(long long n,vector<long long>&arr){ tree.resize(2*n - 1); build(0,0,n-1,arr,n); } dataa combine(dataa left,dataa right){ dataa res; res.lval = right.lval; res.fval = left.fval; res.lcount = left.lcount + right.lcount + (left.lval < right.fval); res.rcount = left.rcount + right.rcount + (left.lval >= right.fval); res.ans = left.ans + right.ans; res.ans -= max(0LL,(right.fval - left.lval)) * S; res.ans += max(0LL,(left.lval - right.fval)) * T; return res; } void push(long long node,long long left,long long right){ long long mid = (left + right)>>1; long long z = node + ((mid - left + 1)<<1); if (tree[node].lazy!=0){ tree[node + 1].add(left,right,tree[node].lazy); tree[z].add(left,right,tree[node].lazy); tree[node].lazy = 0; } } dataa query(long long node,long long left,long long right,long long qleft,long long qright){ if (qright<left|| qleft > right)return {0,0,0,0,0}; if (qleft<=left && qright>=right){ return tree[node]; } push(node,left,right); long long mid = (left + right)>>1; long long z = node + ((mid - left + 1)<<1); return combine(query(node + 1,left,mid,qleft,qright),query(z,mid + 1,right,qleft,qright)); } void update(long long node,long long left,long long right,long long uleft,long long uright,long long v){ if (left > uright || right < uleft) return; if (uleft <= left && right <=uright){ tree[node].add(left,right,v); return; } push(node,left,right); long long mid = (left + right)>>1; long long z = node + ((mid - left + 1)<<1); if (uleft<=mid){ update(node + 1,left,mid,uleft,uright,v); } if (uright > mid){ update(z,mid + 1,right,uleft,uright,v); } tree[node] = combine(tree[node + 1],tree[z]); } }; int main(){ ios_base::sync_with_stdio(false); cin.tie(0); long long n,q; cin>>n>>q>>S>>T; ++n; vector<long long>arr(n); for (long long i = 0;i<n;++i)cin>>arr[i]; Segment_Tree st; st.init(n,arr); for (long long i = 0;i<q;++i){ long long l,r,x;cin>>l>>r>>x; st.update(0,0,n - 1,l,r,x); dataa ans = st.query(0,0,n-1,0,n-1); cout<<ans.ans<<'\n'; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...