#include<bits/stdc++.h>
using namespace std;
#define NAME "TEST"
#define nl '\n'
#define allofa(x,sz) x,x+sz+1
#define allof(x) x.begin(),x.end()
#define mset(x,val) memset(x,val,sizeof(x))
template<class X,class Y> bool minimize(X &a, Y b){if(a>b){a=b;return true;}return false;};
template<class X,class Y> bool maximize(X &a, Y b){if(a<b){a=b;return true;}return false;};
typedef long long ll;
const ll mod = (long long)1e9+7;
const ll LINF = (long long)1e18;
const int INF = (int)1e9;
const int MAXN = (int)2e5+5;
int a[MAXN];
int n,q,s,t;
void ccps() {
ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
if(fopen(NAME".inp","r")) {
freopen(NAME".inp","r",stdin);
freopen(NAME".out","w",stdout);
}
}
namespace sub1 {
const int N = 2010;
ll diff[N],pref[N];
bool check() {
return n<=2000 and q<=2000;
}
void sol() {
vector<int> v;
for (int i = 0; i<=n; i++) {
v.push_back(a[i]);
}
reverse(allof(v));
for (int i = 0; i<n; i++) {
diff[i+1]=v[i+1]-v[i];
}
for (int i = 1; i<=n; i++) cout << diff[i] << " ";
cout << nl;
while(q--) {
int l,r,x; cin >> l >> r >> x;
l=n-l;
r=n-r;
if(l>r) swap(l,r);
// l--;r--;
diff[l]+=x;
diff[r+1]-=x;
ll res = 0;
for (int i = 1; i<=n; i++) {
if(diff[i]>0) res+=1LL*t*diff[i];
else res+=1LL*s*diff[i];
}
cout << res << nl;
}
}
}
namespace sub2 {
ll diff[MAXN];
bool check() {
return s==t;
}
struct SegmentTree {
int n;
vector<ll> seg;
vector<ll> lazy;
SegmentTree(int N=0) {
n=N;
if(n>0) {
seg.assign(4*n+4,0);
lazy.assign(4*n+4,0);
}
}
void build(int node, int l, int r) {
if(l==r) {
seg[node]=diff[l];
return;
}
int mid = (l+r)>>1;
build(2*node,l,mid);
build(2*node+1,mid+1,r);
seg[node] = seg[2*node]+seg[2*node+1];
}
void build() {
build(1,1,n);
}
void Push(int node, int l, int r) {
if(lazy[node]!=0) {
ll t = lazy[node];
int mid = (l+r)>>1;
seg[2*node]+=t*(mid-l+1);
lazy[2*node]+=t;
seg[2*node+1]+=t*(r-mid);
lazy[2*node+1]+=t;
lazy[node]=0;
}
}
void update(int node, int l, int r, int wantedL, int wantedR, ll val) {
if(wantedR<l or r<wantedL) return;
if(wantedL<=l and r<=wantedR) {
seg[node]+=(r-l+1)*val;
lazy[node]+=val;
return;
}
Push(node,l,r);
int mid = (l+r)>>1;
update(2*node,l,mid,wantedL,wantedR,val);
update(2*node+1,mid+1,r,wantedL,wantedR,val);
seg[node]=seg[2*node]+seg[2*node+1];
}
void update(int l, int r, ll val) {
update(1,1,n,l,r,val);
}
ll getVal(int node, int l, int r, int wantedL, int wantedR) {
if(wantedR<l or r<wantedL) return 0;
if(wantedL<=l and r<=wantedR) return seg[node];
Push(node,l,r);
int mid = (l+r)>>1;
return getVal(2*node,l,mid,wantedL,wantedR)+getVal(2*node+1,mid+1,r,wantedL,wantedR);
}
ll getVal() {
return getVal(1,1,n,1,n);
}
} st;
void sol() {
vector<int> v;
for (int i = 0; i<=n; i++) {
v.push_back(a[i]);
}
reverse(allof(v));
for (int i = 0; i<n; i++) {
diff[i+1]=v[i+1]-v[i];
}
st = SegmentTree(n);
st.build();
while(q--) {
int l,r,x; cin >> l >> r >> x;
l=n-l;
r=n-r;
if(l>r) swap(l,r);
st.update(l,l,x);
st.update(r+1,r+1,-x);
cout << s*st.getVal() << nl;
}
}
}
signed main() {
ccps();
cin >> n >> q >> s >> t;
bool isSub2 = (s==t);
for (int i = 0; i<=n; i++) {
cin >> a[i];
}
if(sub1::check() and !isSub2) sub1::sol();
else if(sub2::check() and isSub2) sub2::sol();
}
Compilation message (stderr)
foehn_phenomena.cpp: In function 'void ccps()':
foehn_phenomena.cpp:22:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
22 | freopen(NAME".inp","r",stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
foehn_phenomena.cpp:23:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
23 | freopen(NAME".out","w",stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |