結果
| 問題 |
No.876 Range Compress Query
|
| コンテスト | |
| ユーザー |
startcpp
|
| 提出日時 | 2019-09-06 21:39:32 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.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 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 18 |
ソースコード
//階差
#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;
}
startcpp