제출 #1313541

#제출 시각아이디문제언어결과실행 시간메모리
1313541pvproFish 3 (JOI24_fish3)C++20
100 / 100
340 ms36056 KiB
#ifndef LOCAL
#pragma GCC Optimize("O3,Ofast,unroll-loops")
#pragma GCC Target("bmi,bmi2,avx,avx2")
#endif
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
using ld = long double;

#define int ll

#define f first 
#define s second 
#define mp make_pair 
#define pb push_back
#define pii pair<int, int>
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin() (x).rend()
#ifndef LOCAL
#define endl "\n"
#endif

mt19937 rnd(11);

const int MAX_N = (1<<19);

pii T[MAX_N * 2];

void push(int i, int x, int l, int r) {
	T[i].s += x;
	T[i].f += x * (r - l);
}

void push(int i, int l, int r) {
	int m = (l + r) / 2;
	push(i * 2, T[i].s, l, m);
	push(i * 2 + 1, T[i].s, m, r);
	T[i].s = 0;
}

void update(int i, int l, int r, int ql, int qr, int qx) {
	if (l >= qr || r <= ql) {
		return;
	}
	if (ql <= l && r <= qr) {
		push(i, qx, l, r);
	} else {
		int m = (l + r) / 2;
		push(i, l, r);
		update(i * 2, l, m, ql, qr, qx);
		update(i * 2 + 1, m, r, ql, qr, qx);
		T[i].f = T[i * 2].f + T[i * 2 + 1].f;
	}
}

int get(int i, int l, int r, int ql, int qr) {
	if (l >= qr || r <= ql) {
		return 0;
	}
	if (ql <= l && r <= qr) {
		return T[i].f;
	} else {
		int m = (l + r) / 2;
		push(i, l, r);
		return get(i * 2, l, m, ql, qr) + get(i * 2 + 1, m, r, ql, qr);
	}
}

struct F {
	vector<int> t;
	F(int n) {
		t.assign(n, 0);
	}
	void upd(int i, int x) {
		for (; i < t.size(); i = (i|(i + 1))) {
			t[i] += x;
		}
	}
	int get(int r) {
		int ans = 0;
		for (; r >= 0; r = (r&(r + 1)) - 1) {
			ans += t[r];
		}
		return ans;
	}
};

void solve() {
	memset(T, 0, sizeof(T));
    int n, d;
	cin >> n >> d;
	vector<int> a(n);
	for (auto &x : a) {
		cin >> x;
	}
	int q;
	cin >> q;
	vector<array<int, 3>> quests(q);
	int ind = 0;
	for (auto &x : quests) {
		cin >> x[0] >> x[1];
		--x[0]; --x[1];
		x[2] = ind++;
	}
	sort(all(quests), [&](array<int, 3> a, array<int, 3> b) {
		return a[1] < b[1];
	});
	F f(n);
	vector<int> ans(q, -1);
	vector<int> st;
	int l = 0;
	ind = 0;
	auto getA = [&](int ind) {
		return a[ind] + f.get(ind);
	};
	for (int i = 0; i < n; ++i) {
		if (i && a[i] < a[i - 1]) {
			st.pop_back();
			int cnt = (a[i - 1] - a[i] + d - 1) / d;
			f.upd(i, cnt * d);
			while (!st.empty()) {
				int ind = st.back();
				int delta = (getA(ind + 1) - getA(ind)) / d;
				if (delta <= cnt) {
					cnt -= delta;
					f.upd(ind + 1, -delta * d);
					update(1, 0, MAX_N, ind + 1, i, delta);
					st.pop_back();
				} else {
					f.upd(ind + 1, -cnt * d);
					update(1, 0, MAX_N, ind + 1, i, cnt);
					cnt = 0;
					break;
				}
			}
			update(1, 0, MAX_N, 0, i, cnt);
			f.upd(0, -cnt * d);
		}
		// for (int j = 0; j < n; ++j) {
		// 	cout << getA(j) << ' ';
		// }
		// cout << endl;
		while (getA(l) < 0) {
			++l;
		}
		st.pb(i);
		while (ind < quests.size() && quests[ind][1] == i) {
			if (quests[ind][0] >= l) {
				ans[quests[ind][2]] = get(1, 0, MAX_N, quests[ind][0], i + 1);
			}
			++ind;
		}
	}
	for (auto &x : ans) {
		cout << x << ' ';
	}
	cout << endl;
}

signed main() {
    #ifdef LOCAL
        freopen("in.txt", "r", stdin);
        freopen("out.txt", "w", stdout);
    #else
        ios::sync_with_stdio(false);
        cin.tie(0);
    #endif
    int t = 1;
    // cin >> t;
    while (t--) {
        solve();
    }
}
#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...