結果
問題 | No.876 Range Compress Query |
ユーザー | startcpp |
提出日時 | 2019-09-06 21:39:32 |
言語 | C++11 (gcc 11.4.0) |
結果 |
AC
|
実行時間 | 239 ms / 2,000 ms |
コード長 | 1,184 bytes |
コンパイル時間 | 602 ms |
コンパイル使用メモリ | 58,888 KB |
実行使用メモリ | 8,320 KB |
最終ジャッジ日時 | 2024-06-24 17:12:26 |
合計ジャッジ時間 | 3,653 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 4 ms
7,424 KB |
testcase_01 | AC | 6 ms
7,552 KB |
testcase_02 | AC | 5 ms
7,552 KB |
testcase_03 | AC | 6 ms
7,544 KB |
testcase_04 | AC | 5 ms
7,552 KB |
testcase_05 | AC | 4 ms
7,552 KB |
testcase_06 | AC | 6 ms
7,588 KB |
testcase_07 | AC | 5 ms
7,552 KB |
testcase_08 | AC | 6 ms
7,488 KB |
testcase_09 | AC | 5 ms
7,552 KB |
testcase_10 | AC | 6 ms
7,424 KB |
testcase_11 | AC | 236 ms
8,168 KB |
testcase_12 | AC | 195 ms
7,936 KB |
testcase_13 | AC | 194 ms
8,088 KB |
testcase_14 | AC | 233 ms
8,192 KB |
testcase_15 | AC | 168 ms
8,176 KB |
testcase_16 | AC | 229 ms
8,320 KB |
testcase_17 | AC | 227 ms
8,052 KB |
testcase_18 | AC | 239 ms
8,260 KB |
ソースコード
//階差 #include <iostream> #define int long long #define rep(i, n) for(i = 0; i < (n); i++) using namespace std; const int DEPTH = 17; struct SegTree { int d[1 << (DEPTH + 1)]; int f[1 << (DEPTH + 1)]; SegTree() { int i; rep(i, 1 << (DEPTH + 1)) { d[i] = 0; f[i] = 0; } } void add(int pos, int x) { pos += (1 << DEPTH) - 1; d[pos] += x; f[pos] = (d[pos] != 0); while (pos > 0) { pos = (pos - 1) / 2; d[pos] = d[pos * 2 + 1] + d[pos * 2 + 2]; f[pos] = f[pos * 2 + 1] + f[pos * 2 + 2]; } } int fsum(int l, int r, int a = 0, int b = (1 << DEPTH), int id = 0) { if (a >= r || b <= l) return 0; if (l <= a && b <= r) return f[id]; int x = fsum(l, r, a, (a + b) / 2, id * 2 + 1); int y = fsum(l, r, (a + b) / 2, b, id * 2 + 2); return x + y; } }; int n, q; int a[100000]; int t, l, r; SegTree seg; signed main() { int i; cin >> n >> q; rep(i, n) cin >> a[i]; rep(i, n - 1) seg.add(i + 1, a[i + 1] - a[i]); //セグ木は、1-indexed rep(i, q) { cin >> t >> l >> r; l--; r--; if (t == 1) { int x; cin >> x; seg.add(l, x); seg.add(r + 1, -x); } else { cout << seg.fsum(l + 1, r + 1) + 1 << endl; } } return 0; }