玄关 线段树模版
查看原帖
玄关 线段树模版
590609
jiangjiangQwQ楼主2023/5/20 21:57
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1e6 + 5;
#define void inline void
#define int long long
#define ls(c) c << 1
#define rs(c) c << 1 | 1
#define For(i, l, r) for (register int i = l; i <= r; i++)
int n,q,s;
template < typename T > void read(T & ff) {
	T rr = 1;
	ff = 0;
	char ch = getchar();
	while (!isdigit(ch)) {
		if (ch == '-') rr = -1;
		ch = getchar();
	}
	while (isdigit(ch)) {
		ff = (ff << 1) + (ff << 3) + (ch ^ 48);
		ch = getchar();
	}
	if(ch==' ')  s++;
	ff *= rr;
}
struct node {
	int l, r, tag, Min;
} t[N * 4];
void down(int c) {
	if (t[c].tag) {
		t[ls(c)].tag += t[c].tag;
		t[rs(c)].tag += t[c].tag;
		t[ls(c)].Min += t[c].tag;
		t[rs(c)].Min += t[c].tag;
		t[c].tag = 0;
	}
}
void build(int c, int l, int r) {
	t[c].l = l;
	t[c].r = r;
	if (l == r) {
		cin >> t[c].Min;
		return;
	}
	int mid = (l + r) >> 1;
	build(ls(c), l, mid);
	build(rs(c), mid + 1, r);
	t[c].Min = min(t[ls(c)].Min, t[rs(c)].Min);
}
int query(int c, int l, int r) {
	if (l <= t[c].l && r >= t[c].r) return t[c].Min;
	down(c);
	int mid = (t[c].l + t[c].r) >> 1, ans = 1e16;
	if (l <= mid) ans = min(ans, query(ls(c), l, r));
	if (r > mid) ans = min(ans, query(rs(c), l, r));
	return ans;
}
void add(int c, int l, int r, int k) {
	if (l <= t[c].l && r >= t[c].r) {
		t[c].tag += k;
		t[c].Min += k;
		return;
	}
	down(c);
	int mid = (t[c].l + t[c].r) >> 1;
	if (l <= mid) add(ls(c), l, r, k);
	if (r > mid) add(rs(c), l, r, k);
	t[c].Min = min(t[ls(c)].Min, t[rs(c)].Min);
	return;
}

signed main() {
	ios::sync_with_stdio(false);
	cin.tie();
	cout.tie();
	cin >> n;
	build(1, 1, n);
	cin >> q;
	while (q--) {
		s=0;
		int L,R,K;
		read(L);
		read(R);
		L++;R++;
		if(s==2) {
			read(K);
			if (L <= R) add(1, L, R, K);
			else add(1, 1, n, K), add(1, 1, R, K);
		} else {
			if (L <= R) cout << query(1, L, R) << '\n';
			else cout << min(query(1, 1, n), query(1, 1, R)) << '\n';
		}
	}
	return 0;
}
2023/5/20 21:57
加载中...