Submission #1339943

#TimeUsernameProblemLanguageResultExecution timeMemory
1339943pyoroMonkey and Apple-trees (IZhO12_apple)C++20
0 / 100
1 ms344 KiB
#include <bits/stdc++.h>
using namespace std;

#define ln "\n"
#define fast_cin() \
    ios_base::sync_with_stdio(false); \
    cin.tie(NULL)
#define iofiles() \
    freopen("input.in", "r", stdin); \
    freopen("output.out", "w", stdout)
#define dbg(...) __f(#__VA_ARGS__, __VA_ARGS__)
template <typename Arg1>
void __f(const char *name, Arg1 &&arg1) { cout << name << ": " << arg1 << endl; }
template <typename Arg1, typename... Args>
void __f(const char *names, Arg1 &&arg1, Args &&... args) {
    const char *comma = strchr(names + 1, ',');
    cout.write(names, comma - names) << ": " << arg1 << " |";
    __f(comma + 1, args...);
}

#define ll long long
#define int ll
#define ld long double
#define pb push_back

const ll INF = LLONG_MAX / 4;
const ld PI = acos(-1);
const int MOD = 1000000007;
const double eps = 1e-9;

struct Node {
	int val = 0, lazy = 0;
	bool marked = false;
	
	int lc = -1;
	int rc = -1;
};

struct Segtree {
	vector<Node> st;
	int n;
	
	Segtree(int _n) {
		n = _n;
		st.reserve(1e7);
		st.pb(Node());
	}
	
	void extend(int p) {
		if (st[p].lc == -1) {
			st[p].lc = st.size();
			st.pb(Node());
		}
		if (st[p].rc == -1) {
			st[p].rc = st.size();
			st.pb(Node());
		}
	}
	
	void push(int p, int l, int r) {
		if (!st[p].marked) return;
		
		extend(p);
		int lc = st[p].lc;
		int rc = st[p].rc;
		
		int m = (l + r) / 2;
		st[lc].val = (m - l + 1) * st[p].lazy;
		st[rc].val = (r - m) * st[p].lazy;
		
		
		st[lc].lazy = st[p].lazy;
		st[rc].lazy = st[p].lazy;
		st[p].lazy = 0;
		
		st[lc].marked = true;
		st[rc].marked = true;
		st[p].marked = false;
	}
	
	void update(int p, int l, int r, int i, int j, int v) {
		if (l > j or r < i) return;
		if (l >= i and r <= j) {
			st[p].val = (r - l + 1);
			st[p].lazy = 1;
			st[p].marked = true;
			return;
		}
		
		push(p, l, r);
		
		int m = (l + r) / 2;
		int lc = st[p].lc;
		int rc = st[p].rc;
		
		update(lc, l, m, i, j, v);
		update(rc, m+1,r,i,j,v);
		
		st[p].val = st[lc].val + st[rc].val;
	}
	
	int query(int p, int l, int r, int i, int j) {
		if (p == -1 or l > j or r < i) return 0;
		if (l >= i and r <= j) {
			return st[p].val;
		}
		
		push(p, l, r);
		int lc = st[p].lc;
		int rc = st[p].rc;
		int m = (l + r) / 2;
		
		int res = query(lc, l, m, i, j) + query(rc, m + 1, r, i, j);
		
		return res;
	}
	
	
	void update(int i, int j, int v) {
		update(0, 0, n - 1, i, j, v);
	}
	
	int query(int i, int j) {
		return query(0, 0, n - 1, i, j);
	}
};

void solve() {
    int n;
    cin >> n;
    
    Segtree st(1e10);
    int c = 0;
    
    for (int i = 0; i < n; i++) {
    	int type;
    	cin >> type;
    	if (type == 1) {
    		int l, r;
    		cin >> l >> r;
    		l--, r--;
    		l += c, r+= c;
    		int res = st.query(l, r);
    		c = res;
    		cout << res << ln;
    	}
    	else {
    		int l, r;
    		cin >> l >> r;
    		l--, r--;
    		l += c;
    		r += c;
    		st.update(l, r, 1);
    	}
    }
}

signed main() {
    fast_cin();
    
    int T = 1;
    // cin >> T;
    for (int i = 1; i <= T; i++) {
        solve(  );
    }

    return 0;
}
// g++ A.cpp && ./a.out <input.in>output.out
#Verdict Execution timeMemoryGrader output
Fetching results...