// source problem :
#include <bits/stdc++.h>
using namespace std;
#define all(x) x.begin(), x.end()
#define lb lower_bound
#define ub upper_bound
#define MASK(i) (1LL << (i))
void ckmax(int& f, int s)
{
f = (f > s ? f : s);
}
void ckmin(int& f, int s)
{
f = (f < s ? f : s);
}
const int N = 1e5;
const int D = 61;
int f[N * D] = {}, lc[N * D] = {}, rc[N * D] = {}, lz[N * D] = {}, cnt = 1;
void down(int id, int sz)
{
if (!lz[id]) return;
if (!lc[id]) lc[id] = cnt++;
if (!rc[id]) rc[id] = cnt++;
lz[lc[id]] = 1;
f[lc[id]] = sz;
lz[rc[id]] = 1;
f[rc[id]] = sz;
lz[id] = 0;
}
void update(int u, int v, int id = 0, int l = 1, int r = 1 << 30)
{
if (r < u || l > v) return;
if (l >= u && r <= v)
{
//cout << l << ' ' << r << ' ' << id << '\n';
f[id] = r - l + 1;
lz[id] = 1;
return;
}
down(id, (r - l + 1) >> 1);
int mid = (l + r) >> 1;
if (mid >= u)
{
if (!lc[id]) lc[id] = cnt++;
update(u, v, lc[id], l, mid);
}
if (mid + 1 <= v)
{
if (!rc[id]) rc[id] = cnt++;
update(u, v, rc[id], mid + 1, r);
}
f[id] = (lc[id] ? f[lc[id]] : 0) + (rc[id] ? f[rc[id]] : 0);
}
int get(int u, int v, int id = 0, int l = 1, int r = 1 << 30)
{
if (r < u || l > v) return 0;
if (l >= u && r <= v) return f[id];
down(id, (r - l + 1) >> 1);
int mid = (l + r) >> 1;
return (lc[id] ? get(u, v, lc[id], l, mid) : 0) + (rc[id] ? get(u, v, rc[id], mid + 1, r) : 0);
}
int32_t main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int q;
cin >> q;
int c = 0;
while (q--)
{
int t, l, r;
cin >> t >> l >> r;
l += c;
r += c;
if (t == 1)
{
c = get(l, r);
cout << c << '\n';
}
else update(l, r);
//cout << "ROOT " << f[0] << '\n';
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |