Cod sursa(job #2980672)

Utilizator moldovan_robert_lolMoldovan Robert moldovan_robert_lol Data 16 februarie 2023 18:41:33
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.55 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <utility>
#include <algorithm>

std::ifstream fin("hotel.in");
std::ofstream fout("hotel.out");

struct SegTreeNode {
	int64_t sum = 0;
	int64_t pfx_sum = 0;
	int64_t sfx_sum = 0;
	int64_t max_sum = 0;
};

int x, q;
SegTreeNode tree[400005];
int64_t lazy[400005];

void init_tree(int node, int l, int r) {
	if (l==r) {
		tree[node].sum = tree[node].pfx_sum = tree[node].sfx_sum = tree[node].max_sum = 1;
		return;
	}

	int m = (l+r)>>1;
	init_tree(node<<1,l,m);
	init_tree(node<<1|1,m+1,r);
	tree[node].sum = tree[node<<1].sum + tree[node<<1|1].sum;
	tree[node].pfx_sum = std::max(tree[node<<1].pfx_sum,tree[node<<1].sum+tree[node<<1|1].pfx_sum);
	tree[node].sfx_sum = std::max(tree[node<<1|1].sfx_sum,tree[node<<1|1].sum+tree[node<<1].sfx_sum);
	tree[node].max_sum = std::max(tree[node].pfx_sum,
						 std::max(tree[node].sfx_sum,
						 std::max(tree[node<<1].max_sum,
						 std::max(tree[node<<1|1].max_sum,
								  tree[node<<1].sfx_sum+tree[node<<1|1].pfx_sum))));
}

void push(int node, int l, int r) {
	if (!lazy[node]) return;
	tree[node].sum = 1LL*(r-l+1)*lazy[node];
	tree[node].pfx_sum = 1LL*(r-l+1)*lazy[node];
	tree[node].sfx_sum = 1LL*(r-l+1)*lazy[node];
	tree[node].max_sum = 1LL*(r-l+1)*lazy[node];

	if (l!=r) {
		int m = (l+r)>>1;
		tree[node<<1].sum = 1LL*(m-l+1)*lazy[node];
		tree[node<<1].pfx_sum = 1LL*(m-l+1)*lazy[node];
		tree[node<<1].sfx_sum = 1LL*(m-l+1)*lazy[node];
		tree[node<<1].max_sum = 1LL*(m-l+1)*lazy[node];
		tree[node<<1|1].sum = 1LL*(r-m)*lazy[node];
		tree[node<<1|1].pfx_sum = 1LL*(r-m)*lazy[node];
		tree[node<<1|1].sfx_sum = 1LL*(r-m)*lazy[node];
		tree[node<<1|1].max_sum = 1LL*(r-m)*lazy[node];

		lazy[node<<1] = lazy[node];
		lazy[node<<1|1] = lazy[node];
	}

	lazy[node] = 0;
}

void update(int node, int l, int r, int st, int fi, int val) {
	push(node,l,r);
	if (l>fi||r<st) return;
	if (st<=l&&r<=fi) {
		lazy[node] += val;
		push(node,l,r);
		return;
	}

	int m = (l+r)>>1;
	update(node<<1,l,m,st,fi,val);
	update(node<<1|1,m+1,r,st,fi,val);
	tree[node].sum = tree[node<<1].sum + tree[node<<1|1].sum;
	tree[node].pfx_sum = std::max(tree[node<<1].pfx_sum,tree[node<<1].sum+tree[node<<1|1].pfx_sum);
	tree[node].sfx_sum = std::max(tree[node<<1|1].sfx_sum,tree[node<<1|1].sum+tree[node<<1].sfx_sum);
	tree[node].max_sum = std::max(tree[node].pfx_sum,
						 std::max(tree[node].sfx_sum,
						 std::max(tree[node<<1].max_sum,
						 std::max(tree[node<<1|1].max_sum,
								  tree[node<<1].sfx_sum+tree[node<<1|1].pfx_sum))));
}

SegTreeNode query(int node, int l, int r, int st, int fi) {
	SegTreeNode ret = {-0x5f3f3f3f3f3f3f3f,-0x5f3f3f3f3f3f3f3f,-0x5f3f3f3f3f3f3f3f,-0x5f3f3f3f3f3f3f3f};
	push(node,l,r);
	if (l>fi||r<st) return ret;
	if (st<=l&&r<=fi) {
		return tree[node];
	}

	int m = (l+r)>>1;
	SegTreeNode left = query(node<<1,l,m,st,fi);
	SegTreeNode right = query(node<<1|1,m+1,r,st,fi);
	ret.sum = left.sum + right.sum;
	ret.pfx_sum = std::max(left.pfx_sum,left.sum+right.pfx_sum);
	ret.sfx_sum = std::max(right.sfx_sum,right.sum+left.sfx_sum);
	ret.max_sum = std::max(ret.pfx_sum,
				  std::max(ret.sfx_sum,
				  std::max(left.max_sum,
				  std::max(right.max_sum,
						   left.sfx_sum+right.pfx_sum))));

	return ret;
}

int main() {
	fin >> x >> q;

	init_tree(1,1,x);
	while (q--) {
		int op, a, b;
		fin >> op;
		if (op<=2) fin >> a >> b;

		if (op==1) {
			update(1,1,x,a,a+b-1,-0x3f3f3f3f);
		}
		else if (op==2) {
			update(1,1,x,a,a+b-1,1);
		}
		else {
			SegTreeNode tmp = query(1,1,x,1,x);
			fout << std::max(static_cast<int64_t>(0),tmp.max_sum) << "\n";
		}
	}
}