#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) {}
};
inline void create_kids(node *u) {
if (u->l == u->r || u->lc != nullptr) return;
int mid = (u->l + u->r)/2;
u->lc = new node(u->l, mid);
u->rc = new node(mid+1, u->r);
}
void propagate(node *u) {
create_kids(u);
if (u->lazy != 0) {
u->sum = (u->r - u->l + 1) * u->lazy;
if (u->l != u->r)
u->lc->lazy = u->lazy, u->rc->lazy = u->lazy;
u->lazy = 0;
}
}
void update(node *u, int ul, int ur) {
if (ur < u->l || u->r < ul) return;
propagate(u);
if (ul <= u->l && u->r <= ur) {
u->lazy = 1;
propagate(u);
return;
}
update(u->lc, ul, ur);
update(u->rc, ul, ur);
u->sum = u->lc->sum + u->rc->sum;
}
int query(node *u, int ql, int qr) {
if (qr < u->l || u->r < ql) return 0;
propagate(u);
if (ql <= u->l && u->r <= qr) return u->sum;
return query(u->lc, ql, qr) +
query(u->rc, 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 = query(segtree, l, r);
cout << c << '\n';
} else {
update(segtree, l, r);
}
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |