/**
* @author nhuang685
* @date 2023-03-05 19:26:54
*/
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
template <class OP>
class LazySegmentTree {
private:
using T = typename decay<decltype(OP::ID)>::type;
using st2 = long long;
st2 sz;
struct Node {
T val, la = 0, ls = OP::ID2;
// st2 ind;
int l = -1, r = -1;
Node() : val(OP::ID) {}
Node(T _val) : val(_val) {}
};
vector<Node> data;
void push(int ind, st2 l, st2 r) {
if (data[ind].l == -1) {
data.push_back(Node());
data[ind].l = (int)data.size() - 1;
}
if (data[ind].r == -1) {
data.push_back(Node());
data[ind].r = (int)data.size() - 1;
}
if (data[ind].ls == OP::ID2) {
if (data[ind].la == 0) return;
data[ind].val += OP::all(l, r, data[ind].la);
if (l != r) {
data[data[ind].l].la += data[ind].la;
data[data[ind].r].la += data[ind].la;
}
data[ind].la = 0;
} else {
data[ind].ls += data[ind].la;
data[ind].la = 0;
data[ind].val = OP::all(l, r, data[ind].ls);
if (l != r) {
data[data[ind].l].ls = data[ind].ls;
data[data[ind].l].la = 0;
data[data[ind].r].ls = data[ind].ls;
data[data[ind].r].la = 0;
}
data[ind].ls = OP::ID2;
}
}
void pull(int i) {
data[i].val = OP::comb((data[i].l == -1) ? OP::ID : data[data[i].l].val,
(data[i].r == -1) ? OP::ID : data[data[i].r].val);
}
void modify(st2 a, st2 b, T v, bool add, int ind, st2 l, st2 r) {
push(ind, l, r);
if (r < a || b < l) return;
if (a <= l && r <= b) {
if (add)
data[ind].la += v;
else
data[ind].ls = v;
push(ind, l, r);
return;
}
st2 mid = (l + r) / 2;
modify(a, b, v, add, data[ind].l, l, mid);
modify(a, b, v, add, data[ind].r, mid + 1, r);
pull(ind);
}
T query(st2 a, st2 b, int ind, st2 l, st2 r) {
push(ind, l, r);
if (r < a || b < l) return OP::ID;
if (a <= l && r <= b) return data[ind].val;
st2 mid = (l + r) / 2;
return OP::comb(query(a, b, data[ind].l, l, mid),
query(a, b, data[ind].r, mid + 1, r));
}
public:
LazySegmentTree() {}
LazySegmentTree(st2 _sz) {
sz = 1;
while (sz < _sz) sz *= 2;
data.push_back(Node());
}
LazySegmentTree(const vector<T> &arr) {
sz = 1;
while (sz < (st2)arr.size()) sz *= 2;
auto build = [&](auto &self, st2 l, st2 r) -> int {
if (l == r) {
data.push_back(Node(arr[l]));
return (int)data.size() - 1;
}
data.push_back(Node());
int ind = (int)data.size() - 1;
st2 mid = (l + r) / 2;
auto tmp = self(self, l, mid);
data[ind].l = tmp;
if ((st2)arr.size() - 1 >= mid + 1) {
tmp = self(self, mid + 1, r);
data[ind].r = tmp;
}
pull(ind);
return ind;
};
build(build, 0, sz - 1);
}
void set(st2 a, st2 b, T v) { modify(a, b, v, false, 0, 0, sz - 1); }
void set(st2 i, T v) { modify(i, i, v, false, 0, 0, sz - 1); }
void add(st2 a, st2 b, T v) { modify(a, b, v, true, 0, 0, sz - 1); }
void add(st2 i, T v) { modify(i, i, v, true, 0, 0, sz - 1); }
T query(st2 a, st2 b) { return query(a, b, 0, 0, sz - 1); }
};
template <class T>
struct Add {
static constexpr T ID = 0, ID2 = -1; // change ID2 as needed
static T comb(T a, T b) { return a + b; }
template <class U>
static T all([[maybe_unused]] U l, [[maybe_unused]] U r, T v) {
return (r - l + 1) * v;
}
};
template <class T>
using Seg = LazySegmentTree<Add<T>>;
int main() {
ios::sync_with_stdio(false);
#ifdef LOCAL
// freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
freopen("log.txt", "w", stderr);
#else
cin.tie(nullptr);
#endif
Seg<int> seg((ll)1e9 + 1);
int M;
cin >> M;
ll C = 0;
while (M--) {
int D;
ll X, Y;
cin >> D >> X >> Y;
if (D == 1)
cout << (C = seg.query(X + C, Y + C)) << '\n';
else
seg.set(X + C, Y + C, 1);
}
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
212 KB |
Output is correct |
2 |
Correct |
1 ms |
212 KB |
Output is correct |
3 |
Correct |
1 ms |
212 KB |
Output is correct |
4 |
Correct |
18 ms |
5728 KB |
Output is correct |
5 |
Correct |
23 ms |
5700 KB |
Output is correct |
6 |
Correct |
21 ms |
5664 KB |
Output is correct |
7 |
Correct |
21 ms |
5736 KB |
Output is correct |
8 |
Correct |
157 ms |
42204 KB |
Output is correct |
9 |
Correct |
315 ms |
83852 KB |
Output is correct |
10 |
Correct |
328 ms |
83720 KB |
Output is correct |
11 |
Correct |
342 ms |
83752 KB |
Output is correct |
12 |
Correct |
344 ms |
83696 KB |
Output is correct |
13 |
Correct |
349 ms |
167040 KB |
Output is correct |
14 |
Correct |
350 ms |
167156 KB |
Output is correct |
15 |
Runtime error |
511 ms |
262144 KB |
Execution killed with signal 9 |
16 |
Halted |
0 ms |
0 KB |
- |