제출 #647599

#제출 시각아이디문제언어결과실행 시간메모리
647599ymmMonkey and Apple-trees (IZhO12_apple)C++17
100 / 100
49 ms3004 KiB
#include <bits/stdc++.h>
#define Loop(x,l,r) for (ll x = (l); x < (ll)(r); ++x)
#define LoopR(x,l,r) for (ll x = (r)-1; x >= (ll)(l); --x)
typedef long long ll;
typedef std::pair<int, int> pii;
typedef std::pair<ll , ll > pll;
using namespace std;

const int N = 1e9+10;

struct node {
	int cnt;
	int l, r;
} seg[100'000'000];

int rt;

int new_node()
{
	static int nxt = 1;
	return nxt++;
}

void up(int i)
{
	assert(seg[i].l);
	assert(seg[i].r);
	seg[i].cnt = seg[seg[i].l].cnt + seg[seg[i].r].cnt;
}

void seg_set(int l, int r, int i, int b, int e)
{
	if (l <= b && e <= r) {
		seg[i].cnt = e-b;
		return;
	}
	if (r <= b || e <= l || seg[i].cnt == e-b)
		return;
	if (!seg[i].l)
		seg[i].l = new_node();
	if (!seg[i].r)
		seg[i].r = new_node();
	seg_set(l, r, seg[i].l, b, (b+e)/2);
	seg_set(l, r, seg[i].r, (b+e)/2, e);
	up(i);
}

int seg_get(int l, int r, int i, int b, int e)
{
	if (l <= b && e <= r)
		return seg[i].cnt;
	if (r <= b || e <= l || seg[i].cnt == 0)
		return 0;
	if (seg[i].cnt == e-b)
		return min(e, r) - max(b, l);
	assert(seg[i].l);
	assert(seg[i].r);
	return   seg_get(l,r,seg[i].l,b,(b+e)/2)
	       + seg_get(l,r,seg[i].r,(b+e)/2,e);
}

int main()
{
	cin.tie(0) -> sync_with_stdio(false);
	rt = new_node();
	int C = 0;
	int q;
	cin >> q;
	while (q--) {
		int d, l, r;
		cin >> d >> l >> r;
		l += C-1; r += C;
		if (d == 1) {
			int x = seg_get(l, r, rt, 0, N);
			C = x;
			cout << x << '\n';
		} else {
			seg_set(l, r, rt, 0, N);
		}
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...