이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <vector>
using namespace std;
int N, Q, S, T;
int* A;
class segtree
{
public:
int v;
int l;
int r;
segtree* left;
segtree* right;
segtree(int L, int R)
{
l = L;
r = R;
if(L == R)
{
left = right = NULL;
v = A[l];
}
else
{
left = new segtree(L, (L+R)/2);
right = new segtree((L+R)/2 + 1, R);
v = 0;
}
}
void update(int L, int R, int U)
{
if(R < l || r < L) return;
if(L <= l && r <= R) v += U;
else
{
left->update(L, R, U);
right->update(L, R, U);
}
}
int val(int I)
{
if(I == 0) return 0;
if(l == r) return v;
return v + ((I <= (l+r)/2) ? left->val(I) : right->val(I));
}
};
int main()
{
cin >> N >> Q >> S >> T;
A = new int[N+1];
for(int i = 0; i <= N; i++) cin >> A[i];
segtree B(1, N);
int w = 0;
for(int i = 1; i <= N; i++) w += (A[i-1] - A[i]) * (A[i-1] < A[i] ? S:T);
int l, r, u;
vector<int> res;
for(int i = 1; i <= Q; i++)
{
cin >> l >> r >> u;
w -= (B.val(l-1) - B.val(l)) * (B.val(l-1) < B.val(l) ? S:T);
if(r != N) w -= (B.val(r) - B.val(r+1)) * (B.val(r) < B.val(r+1) ? S:T);
B.update(l, r, u);
w += (B.val(l-1) - B.val(l)) * (B.val(l-1) < B.val(l) ? S:T);
if(r != N) w += (B.val(r) - B.val(r+1)) * (B.val(r) < B.val(r+1) ? S:T);
res.push_back(w);
}
for(int r:res) cout << r << '\n';
return 0;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |