#include <bits/stdc++.h>
//#pragma GCC optimize("popcnt")
#define all(a) a.begin(), a.end()
using namespace std;
using namespace chrono;
struct node {
int l, r, sum = 0, lazy = 0;
node *lc = nullptr, *rc = nullptr;
node(int l, int r) : l(l), r(r) {}
void create_kids() {
if (l == r || lc != nullptr) return;
int mid = (l+r)/2;
lc = new node(l, mid);
rc = new node(mid+1, r);
}
void propagate() {
create_kids();
if (lazy != 0) {
sum = (r-l+1)*lazy;
if (l != r)
lc->lazy = lazy, rc->lazy = lazy;
lazy = 0;
}
}
void update(int ul, int ur, int x) {
propagate();
if (ul <= l && r <= ur) {
lazy = x;
propagate();
return;
}
if (ur < l || r < ul) return;
create_kids();
lc->update(ul, ur, x);
rc->update(ul, ur, x);
sum = lc->sum + rc->sum;
}
int query(int ql, int qr) {
propagate();
if (ql <= l && r <= qr) return sum;
if (qr < l || r < ql) return 0;
return lc->query(ql, qr) +
rc->query(ql, qr);
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
int n, c = 0; cin>>n;
node* segtree = new node(0, 1'000'000'003);
while (n--) {
int t,l,r; cin>>t>>l>>r;
l += c, r += c;
if (t == 1) {
c = segtree->query(l, r);
cout << c << '\n';
} else {
segtree->update(l, r, 1);
}
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |