Submission #1248142

#TimeUsernameProblemLanguageResultExecution timeMemory
1248142arashmemarFood Court (JOI21_foodcourt)C++20
0 / 100
469 ms113624 KiB
#include <bits/stdc++.h>
using namespace std;

const long long int maxn = 2.5e5 + 100;
const long long int inf = 6e18;

struct Node
{
	long long int L, R, mid;
	long long int v, lazy, mn, s;
	Node *lc, *rc;

	Node (long long int l, long long int r)
	{
		L = l, R = r, mid = (L + R) / 2, v = lazy = mn = s = 0, lc = rc = NULL;
		return ;
	}

	void init()
	{
		if (R - L == 1)
		{
			return ;
		}
		lc = new Node(L, mid);
		rc = new Node(mid, R);
		lc->init();
		rc->init();
		return ;
	}

	void spread()
	{
		if (mn < -v)
		{
			v -= v + mn;
		}
		v += lazy;
		if (lc)
		{
			lc->mn = min(lc->mn, lc->lazy + mn);
			lc->lazy += lazy;
			rc->mn = min(rc->mn, rc->lazy + mn);
			rc->lazy += lazy;
		}
		lazy = 0;
		mn = 0;
		return ;
	}

	void update(long long int l, long long int r, long long int val)
	{
		spread();
		if (L == l and R == r)
		{
			if (val > 0)
			{
				s += val;
			}
			lazy = mn = val;
			mn = min(val, 0ll);
			spread();
			return ;
		}
		if (l < mid)
		{
			lc->update(l, min(r, mid), val);
		}
		if (r > mid)
		{
			rc->update(max(l, mid), r, val);
		}
		return ;
	}

	pair <long long int, long long int> get(long long int p)
	{
		spread();
		if (R - L == 1)
		{
			return {v, s};
		}
		pair <long long int, long long int> ret;
		if (p < mid)
		{
			ret = lc->get(p);
			ret.second += s;
			return ret;
		}
		ret = rc->get(p);
		ret.second += s;
		return ret;
	}
};

vector <pair <long long int, pair <pair <long long int, long long int>, pair <long long int, long long int>>>> qs;
long long int ans[maxn];

struct S
{
	long long int L, R, mid;
	long long int v, lazy, mv;
	S *lc, *rc;
	set <pair <long long int, long long int>> s;

	S(long long int l, long long int r)
	{
		L = l, R = r, mid = (L + R) / 2, lazy = mv = 0, v = inf, lc = rc = NULL;
		return ;
	}

	void init()
	{
		if (R - L == 1)
		{
			s.insert({inf, 0});
			return ;
		}
		lc = new S(L, mid);
		rc = new S(mid, R);
		lc->init();
		rc->init();
		return ;
	}

	void spread()
	{
		v -= lazy;
		mv -= lazy;
		if (lc)
		{
			lc->lazy += lazy;
			rc->lazy += lazy;
		}
		lazy = 0;
		return ;
	}

	void update(long long int p, pair <long long int, long long int> val, bool del)
	{
		spread();
		if (R - L == 1)
		{
			if (del)
			{
				s.erase(val);
			}
			else
			{
				s.insert(val);
			}
			v = (*s.begin()).first - mv;
			return ;
		}
		if (p < mid)
		{
			lc->update(p, val, del);
		}
		else
		{
			rc->update(p, val, del);
		}
		lc->spread();
		rc->spread();
		v = min(lc->v, rc->v);
		return ;
	}

	void update(long long int l, long long int r, long long int val)
	{
		spread();
		if (L == l and R == r)
		{
			lazy = val;
			spread();
			return ;
		}
		if (l < mid)
		{
			lc->update(l, min(r, mid), val);
		}
		if (r > mid)
		{
			rc->update(max(l, mid), r, val);
		}
		lc->spread();
		rc->spread();
		v = min(lc->v, rc->v);
		return ;
	}

	long long int get()
	{
		spread();
		if (R - L == 1)
		{
			long long int tmp = (*s.begin()).second;
			s.erase(s.begin());
			v = (*s.begin()).first - mv;
			return tmp;

		}
		long long int ret;
		lc->spread();
		rc->spread();
		if (lc->v <= 0)
		{
			ret = lc->get();
		}
		else
		{
			ret = rc->get();
		}
		v = min(lc->v, rc->v);
		return ret;
	}
};


int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	long long int n, m, q;
	cin >> n >> m >> q;
	Node *root = new Node(1, n + 1);
	root->init();
	S *root2 = new S(1, n + 1);
	root2->init();
	long long int noq = 0;
	for (long long int i = 1;i <= q;i++)
	{
		long long int com;
		cin >> com;
		if (com == 1)
		{
			long long int l, r, c, k;
			cin >> l >> r >> c >> k;
			root->update(l, r + 1, k);
			qs.push_back({com, {{l, r}, {c, k}}});
		}
		if (com == 2)
		{
			long long int l, r, k;
			cin >> l >> r >> k;
			root->update(l, r + 1, -k);
		}
		if (com == 3)
		{
			long long int a, b;
			cin >> a >> b;
			pair <long long int, long long int> tmp = root->get(a);
			noq++;
			if (b <= tmp.first)
			{
				root2->update(a, {tmp.second - tmp.first + b, noq}, 0);
			}
		}
	}

	for (auto o : qs)
	{
		long long int com = o.first, l = o.second.first.first, r = o.second.first.second, c = o.second.second.first;
		long long int k = o.second.second.second;
		root2->update(l, r + 1, k);
		while (root2->v <= 0)
		{
			ans[root2->get()] = c;
		}
	}
	for (long long int i = 1;i <= noq;i++)
	{
		cout << ans[i] << '\n';
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...