제출 #96063

#제출 시각아이디문제언어결과실행 시간메모리
96063Shafin666Monkey and Apple-trees (IZhO12_apple)C++14
0 / 100
2 ms376 KiB
#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define pii pair<ll, ll>
#define to second
#define cost first
typedef long long ll;
typedef long double ld;
using namespace std;

struct Node {
	ll sum, lazy;
	Node *l, *r;
	Node() : sum(0), lazy(0), l(NULL), r(NULL) { }
}; Node *root;

void propagate(Node *v, ll len) {
	if(v->lazy) {
		if(v->l == NULL) v->l = new Node;
		v->l->sum = len/2;
		v->l->lazy = 1;

		if(v->r == NULL) v->r = new Node;
		v->r->sum = len/2;
		v->r->lazy = 1;

		v->sum = len;
		v->lazy = 0;
	}
}

void add(Node *v, ll L, ll R, ll l, ll r) {
	if(L > R || r < L || l > R) return;
	if(L >= l && R <= r) { 
		v->sum =  (R-L+1); 
		v->lazy = 1;
		return; 
	}
	propagate(v, R-L+1);

	ll mid = (L+R)/2;

	if(l <= mid) {
		if(v->l == NULL) v->l = new Node;
		add(v->l, L, mid, l, r);
	}
	if(mid < r) {
		if(v->r == NULL) v->r = new Node;
		add(v->r, mid+1, R, l, r);
	}

	v->sum = 0;
	if(v->l != NULL) v->sum += v->l->sum;
	if(v->r != NULL) v->sum += v->r->sum;
}

ll get(Node *v, ll L, ll R, ll l, ll r) {
	if(v == NULL) return 0;
	if(L > R || r < L || l > R) return 0;

	ll mid = (L+R)/2;
	ll ans = 0;

	propagate(v, R-L+1);
	if(L >= l && R <= r) return v->sum;
	if(l <= mid) ans += get(v->l, L, mid, l, r);
	if(mid < r) ans += get(v->r, mid+1, R, l, r);

	return ans;
}

void update(ll x, ll y) { add(root, 1, (1<<30), x, y); }
ll query(ll x, ll y) { return get(root, 1, (1<<30), x, y); }

int main()
{
	ll n, c = 0;
	ll x, l, r;

	root = new Node;

	cin >> n;
	while(n--) {
		cin >> x >> l >> r;

		if(x == 2) update(l+c, r+c);
		else {
			ll ans = query(l+c, r+c);
			c += ans;
			cout << ans << endl;
		}
	}
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...