Submission #1146856

#TimeUsernameProblemLanguageResultExecution timeMemory
1146856mnbvcxz123Fish 3 (JOI24_fish3)C++20
100 / 100
241 ms41012 KiB
#include <bits/stdc++.h>
using namespace std;
using lint = long long;
using pi = array<lint, 2>;
#define sz(v) ((int)(v).size())
#define all(v) (v).begin(), (v).end()
#define cr(v, n) (v).clear(), (v).resize(n);
const int MAXN = 300005;

int par[20][MAXN];
lint dep[MAXN];

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	lint n, d;
	cin >> n >> d;
	vector<lint> a(n), sum(n + 1), dum(n), g(n);
	for (auto &x : a)
		cin >> x;
	for (int i = 0; i + 1 < n; i++) {
		dum[i + 1] = dum[i] + (a[i + 1] % d < a[i] % d);
	}
	for (int i = 0; i < n; i++) {
		sum[i + 1] = sum[i] + a[i] / d - dum[i];
		g[i] = a[i] / d - dum[i];
	}
	vector<int> stk = {-1};
	for (int i = 0; i < n; i++) {
		while (sz(stk) > 1 && g[stk.back()] >= g[i])
			stk.pop_back();
		par[0][i + 1] = stk.back() + 1;
		dep[i + 1] = dep[stk.back() + 1] + (i - stk.back()) * g[i];
		stk.push_back(i);
	}
	for (int i = 1; i < 20; i++) {
		for (int j = 1; j <= n; j++) {
			par[i][j] = par[i - 1][par[i - 1][j]];
		}
	}
	int q;
	cin >> q;
	while (q--) {
		int l, r;
		cin >> l >> r;
		l--;
		int lup = r;
		for (int i = 19; i >= 0; i--) {
			if (par[i][lup] > l)
				lup = par[i][lup];
		}
		lint moksum = dep[r] - dep[lup] + (lup - l) * g[lup - 1];
		lint opt = g[lup - 1];
		if (opt + dum[l] < 0)
			cout << "-1\n";
		else
			cout << sum[r] - sum[l] - moksum << "\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...