제출 #1370106

#제출 시각아이디문제언어결과실행 시간메모리
1370106kaiboyBitaro, who Leaps through Time (JOI19_timeleap)C++20
0 / 100
210 ms28804 KiB
#include <algorithm>
#include <iostream>

using namespace std;

const int   N = 300000;
const int  N_ = 1 << 19;
const int INF = 999999999;

int stx0[N_ << 1], sta0[N_ << 1], stb0[N_ << 1], stc0[N_ << 1];
int stx1[N_ << 1], sta1[N_ << 1], stb1[N_ << 1], stc1[N_ << 1];
int n_;

void calc(int xl, int al, int bl, int cl,
		int xr, int ar, int br, int cr,
		int &x, int &a, int &b, int &c) {
	x = xl + xr + max(al - cr, 0);
	a = ar + min(max(al, br), cr) - br;
	b = al + cl - bl >= br ? bl + max(br - al, 0) : INF;
	c = al + cl - bl >= cr ? bl + max(cr - al, 0) : cl;
}

void pul(int i) {
	int l = i << 1, r = l ^ 1;
	calc(stx0[l], sta0[l], stb0[l], stc0[l],
			stx0[r], sta0[r], stb0[r], stc0[r],
			stx0[i], sta0[i], stb0[i], stc0[i]);
	calc(stx1[r], sta1[r], stb1[r], stc1[r],
			stx1[l], sta1[l], stb1[l], stc1[l],
			stx1[i], sta1[i], stb1[i], stc1[i]);
}

void build(int n) {
	for (n_ = 1; n_ < n; n_ <<= 1)
		;
	for (int i = 0; i < n; i++) {
		int s, t; cin >> s >> t;
		stx0[i + n_] = stx1[i + n_] = 0;
		sta0[i + n_] = stb0[i + n_] = s + n_ - i;
		sta1[i + n_] = stb1[i + n_] = s + i + 1;
		stc0[i + n_] = t + n_ - (i + 1);
		stc1[i + n_] = t + i;
	}
	for (int i = n_ - 1; i; i--)
		pul(i);
}

void update(int i, int s, int t) {
	stx0[i + n_] = stx1[i + n_] = 0;
	sta0[i + n_] = stb0[i + n_] = s + n_ - i;
	sta1[i + n_] = stb1[i + n_] = s + i + 1;
	stc0[i + n_] = t + n_ - (i + 1);
	stc1[i + n_] = t + i;
	for (i += n_; i >>= 1; )
		pul(i);
}

void query0(int l, int r, int &x, int &a, int &b, int &c) {
	int l_ = l += n_, r_ = r += n_;
	int xl = 0, al = 0, bl = 0, cl = INF;
	for ( ; l <= r; l >>= 1, r >>= 1) {
		if (l & 1) {
			int x_, a_, b_, c_;
			calc(xl, al, bl, cl,
					stx0[l], sta0[l], stb0[l], stc0[l],
					x_, a_, b_, c_);
			xl = x_, al = a_, bl = b_, cl = c_, l++;
		}
		if (!(r & 1))
			r--;
	}
	int xr = 0, ar = 0, br = 0, cr = INF;
	for (l = l_, r = r_; l <= r; l >>= 1, r >>= 1) {
		if (l & 1)
			l++;
		if (!(r & 1)) {
			int x_, a_, b_, c_;
			calc(stx0[r], sta0[r], stb0[r], stc0[r],
					xr, ar, br, cr,
					x_, a_, b_, c_);
			xr = x_, ar = a_, br = b_, cr = c_, r--;
		}
	}
	calc(xl, al, bl, cl, xr, ar, br, cr, x, a, b, c);
}

void query1(int l, int r, int &x, int &a, int &b, int &c) {
	int l_ = l += n_, r_ = r += n_;
	int xl = 0, al = 0, bl = 0, cl = INF;
	for ( ; l <= r; l >>= 1, r >>= 1) {
		if (l & 1) {
			int x_, a_, b_, c_;
			calc(stx1[l], sta1[l], stb1[l], stc1[l],
					xl, al, bl, cl,
					x_, a_, b_, c_);
			xl = x_, al = a_, bl = b_, cl = c_, l++;
		}
		if (!(r & 1))
			r--;
	}
	int xr = 0, ar = 0, br = 0, cr = INF;
	for (l = l_, r = r_; l <= r; l >>= 1, r >>= 1) {
		if (l & 1)
			l++;
		if (!(r & 1)) {
			int x_, a_, b_, c_;
			calc(xr, ar, br, cr,
					stx1[r], sta1[r], stb1[r], stc1[r],
					x_, a_, b_, c_);
			xr = x_, ar = a_, br = b_, cr = c_, r--;
		}
	}
	calc(xr, ar, br, cr, xl, al, bl, cl, x, a, b, c);
}

int main() {
	ios_base::sync_with_stdio(false), cin.tie(NULL);
	int n, q; cin >> n >> q;
	build(n - 1);
	while (q--) {
		int t; cin >> t;
		if (t == 1) {
			int i, s, t; cin >> i >> s >> t, i--;
			update(i, s, t);
		} else {
			int i, s, j, t; cin >> i >> s >> j >> t, i--, j--;
			if (i == j) {
				cout << max(s - t, 0) << '\n';
				continue;
			}
			int x, a, b, c;
			if (i < j) {
				query0(i, j - 1, x, a, b, c);
				s += n_ - i, t += n_ - j;
				int x_ = x + max(s - c, 0);
				int a_ = a + min(max(s, b), c) - b;
				cout << x_ + max(a_ - t, 0) << '\n';
			} else {
				swap(i, j), swap(s, t);
				query1(i, j - 1, x, a, b, c);
				s += i, t += j;
				int x_ = x + max(t - c, 0);
				int a_ = a + min(max(t, b), c) - b;
				cout << x_ + max(a_ - s, 0) << '\n';
			}
		}
	}
	return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…