이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <stack>
#include <numeric>
#include <cassert>
#define endl '\n'
#define sp ' '
#define pb push_back
#define mp make_pair
#define ff first
#define ss second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
#define int ll
const int maxn = 200005;
int arr[maxn];
int pre[maxn];
int eksi[maxn];
int32_t main(){
ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);cerr.tie(nullptr);
int n,q,s,t;cin>>n>>q>>s>>t;
for(int i=0;i<=n;i++)
cin>>arr[i];
ll ans = 0;
for(int i=1;i<=n;i++){
pre[i] = arr[i]-arr[i-1];
if(pre[i]<0){
eksi[i] = -1;
ans += t*abs(pre[i]);
}
else if(pre[i]>0){
eksi[i] = 1;
ans -= s*(pre[i]);
}
}
while(q--){
int l,r,ek;cin>>l>>r>>ek;
if(ek>0){
if(pre[l] >= 0){
ans -= ek*s;
}else{
ans -= min(ek,abs(pre[l]))*t + max(0LL,pre[l] + ek)*s;
}
}
else if(ek<0){
if(pre[l] <= 0){
ans += t*(abs(ek));
}
else{
ans += min(abs(ek),pre[l])*s + max(0LL,abs(ek)-pre[l])*t;
}
}
ek = -ek;
if(r+1<=n){
if(ek>0){
if(pre[r+1] >= 0){
ans -= ek*s;
}else{
ans -= min(ek,abs(pre[r+1]))*t + max(0LL,pre[r+1] + ek)*s;
}
}
else if(ek<0){
if(pre[r+1] <= 0){
ans += t*(abs(ek));
}
else{
ans += min(abs(ek),pre[r+1])*s + max(0LL,abs(ek)-pre[r+1])*t;
}
}
}
ek = -ek;
pre[l] += ek;
pre[r+1] -= ek;
/*
if(ek>0){
if(pre[l]>=0){
ans += ek*t;
}
else{
ans += min(abs(pre[l]),ek)*s + max(0,ek-abs(pre[l])) * t;
}
}else if(ek < 0){
if(pre[l]<=0){
ans += ek * s; // ek < 0
}
else{
ans -= min(pre[l],abs(ek))*t + max(0,abs(ek) - pre[l]) * s;
}
}
if(r+1<=n){
if(ek>0){
if(pre[r+1] <= 0){
ans -= ek*s;
}
else{
ans -= min(pre[r+1],ek)*t + max(0,ek-abs(pre[r+1]))*s;
}
}
else if(ek < 0){
if(pre[r+1] >= 0){
ans += ek*s;
}
else{
ans
}
}
}
pre[l] += ek;
pre[r+1] -= ek;
*/
/*
pre[l] += ek;
pre[r+1] -= ek;
if(eksi[l] == -1 && pre[l]>=0){
if(pre[l]==0) ans+=s;
else ans += s + t;
}
else if(eksi[l] == 1 && pre[l] <= 0){
if(pre[l]==0) ans -= t;
else ans -= s + t;
}
else if(eksi[l] == 0 && pre[l] < 0){
ans -= s;
}
else if(eksi[l] == 0 && pre[l] > 0){
ans += t;
}
if(r+1<n){
if(eksi[r+1] == -1 && pre[r+1]>=0){
if(pre[r+1]==0) ans+=s;
else ans += s + t;
}
else if(eksi[r+1] == 1 && pre[r+1] <= 0){
if(pre[r+1]==0) ans -= t;
else ans -= s + t;
}
else if(eksi[r+1] == 0 && pre[r+1] < 0){
ans -= s;
}
else if(eksi[r+1] == 0 && pre[r+1] > 0){
ans += t;
}
}
eksi[l] = (pre[l]==0 ? 0 : (pre[l] < 0 ? -1 : 1));
eksi[r+1] = (pre[r+1]==0 ? 0 : (pre[r+1] < 0 ? -1 : 1));
*/
cout << ans << endl;
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |