제출 #1061999

#제출 시각아이디문제언어결과실행 시간메모리
1061999PanosPaskSjeckanje (COCI21_sjeckanje)C++14
0 / 110
1 ms600 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const ll INF = 1e18; struct SegTree { struct Node { /* ans[l][r]: * The maximum answer for this segment * * l and r are boolean variables denoting if we include the leftmost and rightmost elements * respectively */ ll ans[2][2]; int sign[2]; }; Node DEFAULT; int size; vector<Node> tree; Node merge(const Node& a, const Node& b) { Node res; if (a.sign[1] == b.sign[0] || a.sign[1] == 0 || b.sign[0] == 0) { // We can merge for (int l = 0; l < 2; l++) { for (int r = 0; r < 2; r++) { res.ans[l][r] = a.ans[l][1] + b.ans[1][r]; } } } else { for (int l = 0; l < 2; l++) { for (int r = 0; r < 2; r++) { res.ans[l][r] = max(a.ans[l][1] + b.ans[0][r], a.ans[l][0] + b.ans[1][r]); } } } return res; } int val(int v) { if (v < 0) { return -1; } if (v > 0) { return 1; } return 0; } void init(int N) { size = 1; while (size < N) { size *= 2; } for (int l = 0; l < 2; l++) { for (int r = 0; r < 2; r++) { DEFAULT.ans[l][r] = 0; } DEFAULT.sign[l] = 0; } tree.assign(2 * size, DEFAULT); } void set(int i, ll v, int x, int lx, int rx) { if (lx == rx - 1) { tree[x].ans[1][1] = abs(v); tree[x].sign[0] = tree[x].sign[1] = val(v); return; } int mid = (lx + rx) / 2; if (i < mid) { set(i, v, 2 * x + 1, lx, mid); } else { set(i, v, 2 * x + 2, mid, rx); } tree[x] = merge(tree[2 * x + 1], tree[2 * x + 2]); } void set(int i, ll v) { set(i, v, 0, 0, size); } Node calc(int l, int r, int x, int lx, int rx) { if (l >= rx || lx >= r) { return DEFAULT; } else if (l <= lx && rx <= r) { return tree[x]; } int mid = (lx + rx) / 2; Node n1 = calc(l, r, 2 * x + 1, lx, mid); Node n2 = calc(l, r, 2 * x + 2, mid, rx); return merge(n1, n2); } ll calc(int l, int r) { return calc(l, r, 0, 0, size).ans[1][1]; } }; int N, Q; SegTree st; vector<int> A; vector<ll> D; int main(void) { scanf("%d %d", &N, &Q); st.init(N - 1); A.resize(N); D.resize(N - 1); for (int i = 0; i < N; i++) { scanf("%d", &A[i]); } for (int i = 0; i < N - 1; i++) { D[i] = A[i + 1] - A[i]; st.set(i, D[i]); } while (Q--) { int l, r, x; scanf("%d %d %d", &l, &r, &x); l--; l--; r--; if (l >= 0) { D[l] += x; st.set(l, D[l]); } D[r] -= x; st.set(r, D[r]); printf("%lld\n", st.calc(0, N - 1)); } return 0; }

컴파일 시 표준 에러 (stderr) 메시지

Main.cpp: In function 'int main()':
Main.cpp:123:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  123 |     scanf("%d %d", &N, &Q);
      |     ~~~~~^~~~~~~~~~~~~~~~~
Main.cpp:130:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  130 |         scanf("%d", &A[i]);
      |         ~~~~~^~~~~~~~~~~~~
Main.cpp:139:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  139 |         scanf("%d %d %d", &l, &r, &x);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...