求调玄关!!
查看原帖
求调玄关!!
878013
_Supernova楼主2024/11/2 16:53
#include <bits/stdc++.h>
#define ls (id * 2)
#define rs (id * 2 + 1)
using namespace std;
typedef long long ll;
const int N = 1e5 + 5;
ll n, a[N], b[N], q;
ll tr[N << 2]; 
set <ll> s;
void push_up(ll id) {
	tr[id] = tr[ls] + tr[rs];
	return ;
}
void build(ll id, ll l, ll r) {
	if (l == r) {
		tr[id] = a[l];
		return ;
	}
	ll mid = (l + r) >> 1;
	build(ls, l, mid);
	build(rs, mid + 1, r);
	push_up(id);
	return ;
}
void upd(ll id, ll l, ll r, ll x, ll val) {
	if (l == r) {
		tr[id] = val;
		return ;
	}
	ll mid = (l + r) >> 1;
	if (x <= mid) upd(ls, l, mid, x, val);
	else upd(rs, mid + 1, r, x, val);
	push_up(id);
	return ;
}
ll query(ll id, ll l, ll r, ll x, ll y) {
	if (l >= x && r <= y) return tr[id];
	ll mid = (l + r) >> 1, res = 0;
	if (x <= mid) res += query(ls, l, mid, x, y);
	if (y > mid) res += query(rs, mid + 1, r, x, y); 
	return res;
}
int main(void) {
	scanf("%lld", &n);
	for (ll i = 1; i <= n; ++i) {
		scanf("%lld", &a[i]); 
	}
	build(1, 1, n);
	for (ll i = 1; i <= n; ++i) {
		scanf("%lld", &b[i]); 
		if (b[i] > 1) s.insert(i);
	}
	scanf("%lld", &q);
	while (q--) {
		ll op, l, r;
		scanf("%lld %lld %lld", &op, &l, &r);
		if (op == 1) {
			upd(1, 1, n, l, r);
			a[l] = r;
		}
		else if (op == 2) {
			if (r == 1) {
				if (b[l] > 1) s.erase(l);
			}
			else s.insert(l);
		}
		else {
			ll now = l, ans = 0;
			while (now <= r) {
				auto it = s.lower_bound(now);
				ll x;
				if (it == s.end()) {
					x = n + 1;
				}
				else x = *it;
				if (x <= r) {
					if (x - 1 >= now) {
						ans += query(1, 1, n, now, x - 1);
					}
					ans = max(ans + a[x], ans * b[x]);
					now = x + 1;
				}
				else {
					ans += query(1, 1, n, now, r);
					break;
				}
			}
			printf("%lld\n", ans);
		}
	}
	return 0;
}
2024/11/2 16:53
加载中...