Submission #467948

#TimeUsernameProblemLanguageResultExecution timeMemory
467948EliasFountain (eJOI20_fountain)C++17
100 / 100
400 ms49336 KiB
//#pragma GCC optimize("O3")
//#pragma GCC optimize("unroll-loops")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <bits/stdc++.h>

using namespace std;

#define int long long
const int onenineseven = 1e9 + 7;

int ilog2(int x)
{
	int p = 0;
	while (x >>= 1)
		p++;
	return p;
}

struct Level
{
	int size;
	int capacity;
	int level;
};

signed main()
{
	cin.tie(0);
	ios_base::sync_with_stdio(false);

	int n, q;
	cin >> n >> q;

	int logn = ilog2(n) + 1;

	vector<vector<Level>> parents(logn, vector<Level>(n));

	stack<Level> levels;
	levels.push({LLONG_MAX, -1, -1});

	vector<pair<int, int>> ls(n);

	for (auto &[s, c] : ls)
		cin >> s >> c;

	reverse(ls.begin(), ls.end());

	for (int i = 0; i < n; i++)
	{
		auto [s, c] = ls[i];

		while (levels.top().size <= s)
			levels.pop();

		parents[0][i] = {0, c, levels.top().level};

		levels.push({s, c, i});
	}

	// binary lifting
	for (int k = 1; k < logn; k++)
	{
		for (int i = 0; i < n; i++)
		{
			Level f = parents[k - 1][i];
			if (f.level != -1)
			{
				Level s = parents[k - 1][f.level];
				parents[k][i] = {0, f.capacity + s.capacity, s.level};
			}
			else
				parents[k][i] = f;
		}
	}

	while (q--)
	{
		int s, w;
		cin >> s >> w;
		s = n - s;
		for (int p = logn - 1; p >= 0; p--)
		{
			if (s != -1 && w - parents[p][s].capacity > 0)
			{
				w -= parents[p][s].capacity;
				s = parents[p][s].level;
			}
		}

		if (s == -1)
			cout << "0\n";
		else
		{
			cout << n - (s) << "\n";
		}
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...