Submission #2225753


Source Code Expand

#include <bits/stdc++.h>
using namespace std;

template <class V = int, bool MAX = true> struct SegmentTree_RAQ_RMQ {
	struct Node {
		V dat;
		V lazy;
		bool flag;
		Node() : dat(0), lazy(0), flag(false) {}
	};

	const int n;
	vector<Node> seg;
	SegmentTree_RAQ_RMQ(int size) : n(1 << (32 - __builtin_clz(size - 1))), seg(n * 2) {};

	void set(int i, const V v) { seg[i + n] = v; }
	void build() { for (int i = n - 1; i > 0; i--) seg[i] = merge(seg[i * 2].dat, seg[i * 2 + 1].dat); }
	void update(int qbegin, int qend, V val) { update_range_rec(1, 0, n, qbegin, qend, val); }
	V query(int qbegin, int qend) { return query_rec(1, 0, n, qbegin, qend); }

private:
	V merge(const V l, const V r) { return MAX ? max(l, r) : min(l, r); }

	void propagate(int node, int l, int r) {
		if (seg[node].flag) {
			seg[node].dat += seg[node].lazy;
			if (r - l > 1) {
				for (int child = 2 * node; child <= 2 * node + 1; child++) {
					seg[child].lazy += seg[node].lazy;
					seg[child].flag = true;
				}
			}
			seg[node].lazy = 0;
			seg[node].flag = false;
		}
	}

	void update_range_rec(int node, int l, int r, int qbegin, int qend, V val) {
		propagate(node, l, r);
		if (r <= qbegin || qend <= l) {
			return;
		}
		if (qbegin <= l && r <= qend) {
			seg[node].lazy = val;
			seg[node].flag = true;
			propagate(node, l, r);
		}
		else {
			int m = (l + r) >> 1;
			update_range_rec(2 * node + 0, l, m, qbegin, qend, val);
			update_range_rec(2 * node + 1, m, r, qbegin, qend, val);
			seg[node].dat = merge(seg[2 * node].dat, seg[2 * node + 1].dat);
		}
	}

	V query_rec(int node, int l, int r, int qbegin, int qend) {
		propagate(node, l, r);
		if (qbegin <= l && r <= qend) {
			return seg[node].dat;
		}
		if (r <= qbegin || qend <= l) {
			return MAX ? numeric_limits<V>::min() : numeric_limits<V>::max();
		}
		int m = (l + r) >> 1;
		return merge(query_rec(2 * node, l, m, qbegin, qend), query_rec(2 * node + 1, m, r, qbegin, qend));
	}
};

template <class V = int> struct SegmentTree_RAQ_RSQ {
	struct Node {
		V dat;
		V lazy;
		bool flag;
		Node() : dat(0), lazy(0), flag(false) {}
	};

	const int n;
	vector<Node> seg;
	SegmentTree_RAQ_RSQ(int size) : n(1 << (32 - __builtin_clz(size - 1))), seg(n * 2) {};

	void set(int i, const V v) { seg[i + n] = v; }
	void build() {for (int i = n - 1; i > 0; i--) seg[i] = merge(seg[i * 2].dat, seg[i * 2 + 1].dat); }
	void update(int qbegin, int qend, V val) { update_range_rec(1, 0, n, qbegin, qend, val); }
	V query(int qbegin, int qend) { return query_rec(1, 0, n, qbegin, qend); }

private:
	V merge(const V l, const V r) {
		return l + r;
	}

	void propagate(int node, int l, int r) {
		if (seg[node].flag) {
			seg[node].dat += seg[node].lazy * (r - l);
			if (r - l > 1) {
				for (int child = 2 * node; child <= 2 * node + 1; child++) {
					seg[child].lazy += seg[node].lazy;
					seg[child].flag = true;
				}
			}
			seg[node].lazy = 0;
			seg[node].flag = false;
		}
	}

	void update_range_rec(int node, int l, int r, int qbegin, int qend, V val) {
		propagate(node, l, r);
		if (r <= qbegin || qend <= l) {
			return;
		}
		if (qbegin <= l && r <= qend) {
			seg[node].lazy = val;
			seg[node].flag = true;
			propagate(node, l, r);
		}
		else {
			int m = (l + r) >> 1;
			update_range_rec(2 * node + 0, l, m, qbegin, qend, val);
			update_range_rec(2 * node + 1, m, r, qbegin, qend, val);
			seg[node].dat = merge(seg[2 * node].dat, seg[2 * node + 1].dat);
		}
	}

	V query_rec(int node, int l, int r, int qbegin, int qend) {
		propagate(node, l, r);
		if (qbegin <= l && r <= qend) {
			return seg[node].dat;
		}
		if (r <= qbegin || qend <= l) {
			return 0;
		}
		int m = (l + r) >> 1;
		return merge(query_rec(2 * node, l, m, qbegin, qend), query_rec(2 * node + 1, m, r, qbegin, qend));
	}
};

template <class V = int, bool MAX = true> struct SegmentTree_RUQ_RMQ {
	struct Node {
		V dat;
		V lazy;
		bool flag;
		Node() : dat(0), lazy(0), flag(0) {}
	};

	const int n;
	vector<Node> seg;
	SegmentTree_RUQ_RMQ(int size) : n(1 << (32 - __builtin_clz(size - 1))), seg(n * 2) {};

	void set(int i, const V v) { seg[i + n] = v; }
	void build() {for (int i = n - 1; i > 0; i--) seg[i] = merge(seg[i * 2].dat, seg[i * 2 + 1].dat); }
	void update(int qbegin, int qend, V val) { update_range_rec(1, 0, n, qbegin, qend, val); }
	V query(int qbegin, int qend) { return query_rec(1, 0, n, qbegin, qend); }

private:
	V merge(const V l, const V r) { return MAX ? max(l, r) : min(l, r); }

	void propagate(int node, int l, int r) {
		if (seg[node].flag) {
			seg[node].dat = seg[node].lazy;
			if (r - l > 1) {
				for (int child = 2 * node; child <= 2 * node + 1; child++) {
					seg[child].lazy = seg[node].lazy;
					seg[child].flag = true;
				}
			}
			seg[node].lazy = 0;
			seg[node].flag = false;
		}
	}

	void update_range_rec(int node, int l, int r, int qbegin, int qend, V val) {
		propagate(node, l, r);
		if (r <= qbegin || qend <= l) {
			return;
		}
		if (qbegin <= l && r <= qend) {
			seg[node].lazy = val;
			seg[node].flag = true;
			propagate(node, l, r);
		}
		else {
			int m = (l + r) >> 1;
			update_range_rec(2 * node + 0, l, m, qbegin, qend, val);
			update_range_rec(2 * node + 1, m, r, qbegin, qend, val);
			seg[node].dat = merge(seg[2 * node].dat, seg[2 * node + 1].dat);
		}
	}

	V query_rec(int node, int l, int r, int qbegin, int qend) {
		propagate(node, l, r);
		if (qbegin <= l && r <= qend) {
			return seg[node].dat;
		}
		if (r <= qbegin || qend <= l) {
			return MAX ? numeric_limits<V>::min() : numeric_limits<V>::max();
		}
		int m = (l + r) >> 1;
		return merge(query_rec(2 * node, l, m, qbegin, qend), query_rec(2 * node + 1, m, r, qbegin, qend));
	}
};

template <class V=int> struct SegTreeLazyBest {
	const int n;
	vector<V> cur, lazy, best, best_lazy;

	SegTreeLazyBest(int size) : n(p2(size)), cur(n * 2), lazy(n * 2), best(n * 2), best_lazy(n * 2){};

	void update(int begin, int end, V val) {
		update_range_rec(1, 0, n, begin, end, val);
	}

	V query(int begin, int end) {
		return query_rec(1, 0, n, begin, end);
	}

private:
	void propagate(int node) {
		for (int child = 2 * node; child <= 2 * node + 1; child++) {
			best_lazy[child] = max(best_lazy[child], lazy[child] + best_lazy[node]);
			lazy[child] += lazy[node];
			best[child] = max(best[child], cur[child] + best_lazy[node]);
			cur[child] += lazy[node];
		}
		lazy[node] = best_lazy[node] = 0;
	}

	void update_range_rec(int node, int tbegin, int tend, int abegin, int aend, V val) {
		if (abegin <= tbegin && tend <= aend) {
			best_lazy[node] = max(best_lazy[node], lazy[node] += val);
			best[node] = max(best[node], cur[node] += val);
		}
		else {
			propagate(node);
			int mid = tbegin + (tend - tbegin + 1) / 2;
			if (abegin < mid && tbegin < aend) update_range_rec(2 * node, tbegin, mid, abegin, aend, val);
			if (abegin < tend && mid < aend) update_range_rec(2 * node + 1, mid, tend, abegin, aend, val);
			cur[node] = max(cur[2 * node], cur[2 * node + 1]);
			best[node] = max(best[node], cur[node]);
		}
	}

	V query_rec(int node, int tbegin, int tend, int abegin, int aend) {
		if (abegin <= tbegin && tend <= aend) {
			return best[node];
		}
		else {
			propagate(node);
			int mid = tbegin + (tend - tbegin + 1) / 2;
			V res = numeric_limits<V>::min();
			if (abegin < mid && tbegin < aend) res = max(res, query_rec(2 * node, tbegin, mid, abegin, aend));
			if (abegin < tend && mid < aend) res = max(res, query_rec(2 * node + 1, mid, tend, abegin, aend));
			return res;
		}
	}

	static int p2(int n, int m=1) { return m >= n ? m : p2(n, m * 2); }
};


template <class V> struct SegTreeLazy {
	static const V zero = 0;
	static const V def = 0;
	struct Node {
		V dat;
		V lazy;
		bool flag;
		Node() : dat(def), lazy(zero), flag(false) {}
	};

	static V merge(const V &l, const V &r) {
		return l + r;
		return max(l, r);
	}

	const int N;
	vector<Node> seg;

	SegTreeLazy(int size) : N(p2(size)), seg(N * 2) {};

	void set(int i, const V &v) { seg[i + N - 1].dat = v; }

	void build() { for (int i = N - 2; i >= 0; i--) seg[i].dat = merge(seg[i * 2 + 1].dat, seg[i * 2 + 2].dat); }

	void update(int a, int b, V v) {
		update(a, b, v, 0, 0, N);
	}

	V query(int a, int b) {
		return query(a, b, 0, 0, N);
	}

	private:
	void push_add(int k, int l, int r) {
		if (seg[k].flag) {
			seg[k].dat += seg[k].lazy * (r - l);
			seg[k].dat += seg[k].lazy;
			if (r - l > 1) {
				seg[k * 2 + 1].lazy += seg[k].lazy;
				seg[k * 2 + 2].lazy += seg[k].lazy;
				seg[k * 2 + 1].flag = true;
				seg[k * 2 + 2].flag = true;
			}
			seg[k].lazy = zero;
			seg[k].flag = false;
		}
	}

	void push_update(int k, int l, int r) {
		if (seg[k].flag) {
			seg[k].dat = seg[k].lazy;
			seg[k].dat = seg[k].lazy * (r - l);
			seg[k].dat = merge(seg[k].dat, seg[k].lazy);
			if (r - l > 1) {
				seg[k * 2 + 1].lazy = seg[k].lazy;
				seg[k * 2 + 2].lazy = seg[k].lazy;
				seg[k * 2 + 1].flag = true;
				seg[k * 2 + 2].flag = true;
			}
			seg[k].lazy = zero;
			seg[k].flag = false;
		}
	}

	void update(int a, int b, V v, int k, int l, int r) {
		push(k, l, r);
		if (r <= a || b <= l) return;
		if (a <= l && r <= b) {
			seg[k].lazy = v;
			seg[k].flag = true;
			push(k, l, r);
		}
		else {
			update(a, b, v, k * 2 + 1, l, (l + r) / 2);
			update(a, b, v, k * 2 + 2, (l + r) / 2, r);
			seg[k].dat = merge(seg[k * 2 + 1].dat, seg[k * 2 + 2].dat);
		}
	}

	V query(int a, int b, int k, int l, int r) {
		push(k, l, r);
		if (r <= a || b <= l) return zero;
		if (a <= l && r <= b) return seg[k].dat;
		V x = query(a, b, k * 2 + 1, l, (l + r) / 2);
		V y = query(a, b, k * 2 + 2, (l + r) / 2, r);
		return merge(x, y);
	}

	static int p2(int n, int m=1) { return m >= n ? m : p2(n, m * 2); }
};
template<class Val> ostream& operator<<(ostream& os, const SegTreeLazy<Val>& seg) {
	SegTreeLazy<Val> &seg2 = const_cast<SegTreeLazy<Val>&>(seg);
	vector<Val> vec;
	for (int i = 0; i < seg2.N; i++) {
		vec.emplace_back(seg2.query(i, i+1));
	}
	os << vec;
	return os;
}


Submission Info

Submission Time
Task F - 根付き木のみさわさん
User shiratty8
Language C++14 (GCC 5.4.1)
Score 0
Code Size 10299 Byte
Status CE

Compile Error

./Main.cpp: In member function ‘void SegTreeLazy<V>::update(int, int, V, int, int, int)’:
./Main.cpp:324:15: error: there are no arguments to ‘push’ that depend on a template parameter, so a declaration of ‘push’ must be available [-fpermissive]
   push(k, l, r);
               ^
./Main.cpp:324:15: note: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated)
./Main.cpp:329:16: error: there are no arguments to ‘push’ that depend on a template parameter, so a declaration of ‘push’ must be available [-fpermissive]
    push(k, l, r);
                ^
./Main.cpp: In member function ‘V SegTreeLazy<V>::query(int, int, int, int, int)’:
./Main.cpp:339:15: error: there are no arguments to ‘push’ that depend on a template parameter, so a declaration of ‘push’ must be available [-fpermissive]
   push(k, l, r);
               ^