結果
| 問題 |
No.876 Range Compress Query
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2019-09-06 21:39:36 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 115 ms / 2,000 ms |
| コード長 | 1,839 bytes |
| コンパイル時間 | 1,713 ms |
| コンパイル使用メモリ | 170,136 KB |
| 実行使用メモリ | 13,132 KB |
| 最終ジャッジ日時 | 2024-06-24 17:12:37 |
| 合計ジャッジ時間 | 3,898 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 18 |
ソースコード
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); i++)
#define repr(i, n) for (int i = (n) - 1; i >= 0; i--)
#define range(a) a.begin(), a.end()
using namespace std;
using ll = long long;
constexpr int U = 1 << 17;
struct nyan {
ll l, r, s;
bool miao;
};
nyan dat[U * 2];
ll lazy[U * 2];
nyan operator*(nyan a, nyan b) {
if (!a.miao) return b;
if (!b.miao) return a;
nyan res;
res.l = a.l;
res.r = b.r;
res.s = a.s + b.s + (a.r != b.l);
res.miao = true;
return res;
}
void apply(int k, ll v) {
lazy[k] += v;
dat[k].l += v;
dat[k].r += v;
}
void push(int k) {
apply(k * 2 + 0, lazy[k]);
apply(k * 2 + 1, lazy[k]);
lazy[k] = 0;
}
void pull(int k) {
dat[k] = dat[k * 2] * dat[k * 2 + 1];
}
void update(int a, int b, ll v, int k = 1, int l = 0, int r = U) {
if (r <= a || b <= l) return;
if (a <= l && r <= b) {
apply(k, v);
return;
}
push(k);
int m = (l + r) / 2;
update(a, b, v, k * 2 + 0, l, m);
update(a, b, v, k * 2 + 1, m, r);
pull(k);
}
nyan query(int a, int b, int k = 1, int l = 0, int r = U) {
if (r <= a || b <= l) return nyan{0, 0, 0, false};
if (a <= l && r <= b) return dat[k];
push(k);
int m = (l + r) / 2;
nyan vl = query(a, b, k * 2 + 0, l, m);
nyan vr = query(a, b, k * 2 + 1, m, r);
return vl * vr;
}
int main() {
cin.tie(nullptr);
ios::sync_with_stdio(false);
int N, Q; cin >> N >> Q;
vector<int> A(N);
rep(i, N) {
cin >> A[i];
dat[i + U].l = A[i];
dat[i + U].r = A[i];
dat[i + U].s = 0;
dat[i + U].miao = true;
}
for (int i = U - 1; i >= 1; i--) pull(i);
while (Q--) {
int type; cin >> type;
if (type == 1) {
int l, r, x; cin >> l >> r >> x; l--;
update(l, r, x);
} else {
int l, r; cin >> l >> r; l--;
cout << query(l, r).s + 1 << '\n';
}
}
}