Submission #38036

#TimeUsernameProblemLanguageResultExecution timeMemory
38036MatheusLealVFoehn Phenomena (JOI17_foehn_phenomena)C++14
0 / 100
83 ms9208 KiB
#include <bits/stdc++.h> #define inf 2000000000 #define N 200050 #define mid ((a + b)/2) #define l (2*nod) #define r (2*nod + 1) using namespace std; int n, q, S, T, A[N], tree[4*N], lazy[4*N], ans; void prop(int nod, int a, int b) { if(!lazy[nod]) return; tree[nod] += (lazy[nod]*(b - a + 1)); if(a != b) lazy[l] += lazy[nod], lazy[r] += lazy[nod]; lazy[nod] = 0; } void upd(int nod, int a, int b, int i, int j, int x) { prop(nod, a, b); //cout<<"UPDATE "<<a<<" "<<b<<" "<<i<<" "<<j<<" "<<x<<"\n"; if(j < a || i > b) return; if(i <= a && j >= b) { tree[nod] += (x*(b - a + 1)); if(a != b) lazy[l] += x, lazy[r] += x; return; } upd(l, a, mid, i, j, x), upd(r, mid + 1, b, i, j, x); tree[nod] = tree[l] + tree[r]; } int query(int nod, int a, int b, int i, int j) { if(i < 0 || i > n || j > n || j < 0) return inf; prop(nod, a, b); if(j < a || i > b) return 0; if(i <= a && j >= b) return tree[nod]; return query(l, a, mid, i, j) + query(r, mid + 1, b, i, j); } int main() { ios::sync_with_stdio(false); cin.tie(0); cin>>n>>q>>S>>T; for(int i = 0; i <= n; i++) cin>>A[i], upd(1, 0, n, i, i, A[i]); //cout<<query(1, 0, n, n, n)<<"\n"; for(int i = 0; i < n; i++) ans += (A[i] <= A[i + 1] ? (- A[i + 1] + A[i])*S : (A[i] - A[i + 1])*T); //cout<<ans<<"\n"; for(int i = 1; i <= q; i++) { int li, ri, xi; cin>>li>>ri>>xi; int Hl = query(1, 0, n, li, li); int Hr = query(1, 0, n, ri, ri); int H_depois = query(1, 0, n, ri + 1, ri + 1); int H_antes = query(1, 0, n, li - 1, li - 1); upd(1, 0, n, li, ri, xi); int dl = 0, dr = 0; if(H_antes != inf && H_antes <= Hl) dl -= abs(Hl - H_antes)*S ; else if(H_antes != inf) dl += abs(Hl - H_antes)*T; if(Hr <= H_depois && H_depois != inf) dr -= abs(H_depois - Hr)*S ; else if(H_depois != inf) dr += abs(H_depois - Hr)*T; ans = ans - dl - dr; //cout<<"H :: "<<H_antes<<" "<<H_depois<<"\n"; //cout<<"DIMINUINDO "<<dl<<" "<<dr<<"\n"; Hl += xi, Hr += xi; dl = 0, dr = 0; if(H_antes <= Hl&& H_antes != inf) dl -= abs(Hl - H_antes)*S ; else if(H_antes != inf) dl += abs(Hl - H_antes)*T; if(Hr <= H_depois && H_depois != inf) dr -= abs(H_depois - Hr)*S ; else if(H_depois != inf) dr += abs(H_depois - Hr)*T; ans += dl + dr; //cout<<"ADICIONANDO "<<dl<<" "<<dr<<"\n"; cout<<ans<<"\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...