Submission #1313653

#TimeUsernameProblemLanguageResultExecution timeMemory
1313653husseinjuandaFoehn Phenomena (JOI17_foehn_phenomena)C++20
100 / 100
373 ms9740 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long

int t[4*200002];

void update(int i, int l, int r, int i1, int v){
  if(l == r){
    t[i] += v;
    return;
  }
  int mid = (l + r)/2;
  if(i1 <= mid){
    update(i*2, l, mid, i1, v);
  }else{
    update(i*2+1, mid+1, r, i1, v);
  }
  t[i] = t[i*2] + t[i*2+1];
}

int query(int i, int l, int r, int l1, int r1){
  if(l > r1 || l1 > r) return 0;
  if(l1 <= l && r1 >= r){
    return t[i];
  }
  int mid = (l+r)/2;
  return (query(i*2, l, mid, l1, r1) + query(i*2+1, mid+1, r, l1, r1));
}

signed main(){
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int n, q, s, tr; cin >> n >> q >> s >> tr;
  vector<int> x(n+1);
  for(int i = 0; i <= n; i++){
    cin >> x[i];
  }
  int co = 0;
  for(int i = 1; i <= n; i++){
    if(x[i-1] < x[i]){
      co -= s * abs(x[i-1] - x[i]);
    }else{
      co += tr * abs(x[i-1] - x[i]);
    }
  }
  while(q--){
    int l, r, c; cin >>  l >> r >> c;
    //l, l-1
    if(l != 0){
      int a, b;
      a = x[l-1] + query(1, 0, n+1, 0, l-1);
      b = x[l] + query(1, 0, n+1, 0, l);
      if(a < b){
        co += s * abs(a-b);
      }else{
        co -= tr * abs(a-b);
      }
    }
    //r, r+1
    if(r != n){
      int a, b;
      a = x[r] + query(1, 0, n+1, 0, r);
      b = x[r+1] + query(1, 0, n+1, 0, r+1);
      if(a < b){
        co += s * abs(a-b);
      }else{
        co -= tr * abs(a-b);
      }
    }
    update(1, 0, n+1, l, c);
    update(1, 0, n+1, r+1, -c);
    //l, l-1
    if(l != 0){
      int a, b;
      a = x[l-1] + query(1, 0, n+1, 0, l-1);
      b = x[l] + query(1, 0, n+1, 0, l);
      if(a < b){
        co -= s * abs(a-b);
      }else{
        co += tr * abs(a-b);
      }
    }
    //r, r+1
    if(r != n){
      int a, b;
      a = x[r] + query(1, 0, n+1, 0, r);
      b = x[r+1] + query(1, 0, n+1, 0, r+1);
      if(a < b){
        co -= s * abs(a-b);
      }else{
        co += tr * abs(a-b);
      }
    }
    cout << co << "\n";
  }
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...