线段树炸了
查看原帖
线段树炸了
321619
ClapEcho233楼主2021/3/17 22:34

rt,请问我的线段树哪里炸了

#include <bits/stdc++.h>
#define int long long
#define ls (root << 1)
#define rs (root << 1 | 1)

using namespace std;

struct FastIO {
	template <typename T> FastIO& operator >> (T& in) {
		in = 0;
		char ch = getchar ();
		int flag = 1;
		for (; ! isdigit (ch); ch = getchar ()) if (ch == '-') flag = -1;
		for (;   isdigit (ch); ch = getchar ()) in = (in << 3) + (in << 1) + (ch ^ 48);
		in *= flag;
		return *this;
	}
}fin;

const int MaxN = 1e5 + 100;
int arr[MaxN], l[MaxN << 2], r[MaxN << 2], sum[MaxN << 2], lz[MaxN << 2];
int n, m;

inline void PushUp (int root) {
	sum[root] = sum[ls] + sum[rs];
}

inline void PushDown (int root) {
	if (lz[root]) {
		lz[ls] += lz[root];
		lz[rs] += lz[root];
		sum[ls] += lz[root] * (r[ls] - l[ls] + 1);
		sum[rs] += lz[root] * (r[rs] - l[rs] + 1);
		lz[root] = 0;
	}
}

void Begin (int root, int L, int R) {
	l[root] = L, r[root] = R, lz[root] = 0;
	if (L == R) {
		sum[root] = arr[L];
		return ;
	}
	int mid = (L + R) >> 1;
	Begin (ls, L, mid);
	Begin (rs, mid + 1, R);
	PushUp (root);
}

void Add (int root, int L, int R, int k) {
	if (l[root] >= L && r[root] <= R) {
		sum[root] += k * (r[root] - l[root] + 1);
		lz[root] += k;
		return ;
	}
	PushDown (root);
	if (r[ls] >= L) Add (ls, L, R, k);
	if (l[rs] >= R) Add (rs, L, R, k);
	PushUp (root);
}

int Search (int root, int L, int R) {
	if (l[root] >= L && r[root] <= R) {
		return sum[root];
	}
	if (r[root] < L || l[root] > R) {
		return 0;
	}
	PushDown (root);
	int s = 0;
	if (r[ls] >= L) s += Search (ls, L, R);
	if (l[rs] >= R) s += Search (rs, L, R);
	return s;
}

main () {
	
	fin >> n >> m;
	for (int i = 1; i <= n; ++ i) fin >> arr[i];
	Begin (1, 1, n);
	for (int i = 1; i <= m; ++ i) {
		int opt;
		fin >> opt;
		if (opt == 1) {
			int a, b, c;
			fin >> a >> b >> c;
			Add (1, a, b, c);
		} else {
			int a, b;
			fin >> a >> b;
			printf ("%lld\n", Search (1, a, b));
		}
	}
	
	return 0;
}
2021/3/17 22:34
加载中...