Submission #1336943

#TimeUsernameProblemLanguageResultExecution timeMemory
1336943franuchFish 3 (JOI24_fish3)C++20
0 / 100
993 ms104444 KiB
#include <bits/stdc++.h>
using namespace std;
typedef __int128 ll;
typedef pair<ll, ll> pll;
#define vc vector
#define st first
#define nd second
#define all(a) a.begin(), a.end()
#define sz(a) (ll)a.size()
#define pub push_back
#define pob pop_back
const ll INF = 1e18;

ll minl(ll a, ll b) {
	if (a <= b)
		return a;
	return b;
}

namespace Tree {
	ll base;
	vc<ll> tsum, tmin, lazy;
	void init(ll n) {
		base = 1;
		while (base < n)
			base *= 2;
		
		tsum.assign(2 * base, 0);
		tmin.assign(2 * base, INF);
		lazy.assign(2 * base, INF);
	}
	void push(ll i, ll li, ll ri, ll s) {
		if (lazy[i] == INF)
			return;
		tmin[li] = tmin[ri] = lazy[i];
		tsum[li] = tsum[ri] = s * lazy[i];
		lazy[li] = lazy[ri] = lazy[i];
		lazy[i] = INF;
	}
	void update(ll ql, ll qr, ll qx, ll i = 1, ll l = 0, ll r = base - 1) {
		if (qr < l or r < ql)
			return;
		ll s = r - l + 1;
		if (ql <= l and r <= qr) {
			tmin[i] = qx;
			tsum[i] = qx * s;
			lazy[i] = qx;
			return;
		}
		ll m = (l + r) / 2;
		ll li = 2 * i;
		ll ri = li + 1;
		push(i, li, ri, s / 2);
		update(ql, qr, qx, li, l, m);
		update(ql, qr, qx, ri, m + 1, r);
		tsum[i] = tsum[li] + tsum[ri];
		tmin[i] = minl(tmin[li], tmin[ri]);
	}
	ll quesum(ll ql, ll qr, ll i = 1, ll l = 0, ll r = base - 1) {
		if (qr < l or r < ql)
			return 0;
		if (ql <= l and r <= qr)
			return tsum[i];
		ll m = (l + r) / 2;
		ll li = 2 * i;
		ll ri = li + 1;
		ll s = r - l + 1;
		push(i, li, ri, s / 2);
		return quesum(ql, qr, li, l, m) + quesum(ql, qr, ri, m + 1, r);
	}
	ll quemin(ll ql, ll qr, ll i = 1, ll l = 0, ll r = base - 1) {
		if (qr < l or r < ql)
			return INF;
		if (ql <= l and r <= qr)
			return tmin[i];
		ll m = (l + r) / 2;
		ll li = 2 * i;
		ll ri = li + 1;
		ll s = r - l + 1;
		push(i, li, ri, s / 2);
		return minl(quemin(ql, qr, li, l, m), quemin(ql, qr, ri, m + 1, r));
	}
};

struct Qu {
	ll l, r;
};

ll n, D, q;
vc<ll> a;
vc<Qu> qus;
vc<ll> p, b, pb, res;
vc<vc<Qu>> cnt;
vc<pll> stk;

ll mod(ll x) {
	x %= D;
	if (x < 0)
		x += D;
	return x;
}

void input() {
	int tmp;
	cin >> tmp;
	n = tmp;
	cin >> tmp;
	D = tmp;
	a.resize(n + 1);
	a[0] = 0;
	for (ll i = 1; i <= n; i++) {
		cin >> tmp;
		a[i] = tmp;
	}
	cin >> tmp;
	q = tmp;
	qus.resize(q);
	for (auto &qu : qus) {
		cin >> tmp;
		qu.l = tmp;
		cin >> tmp;
		qu.r = tmp;
	}
}

void preprocess() {
	p.resize(n + 1);
	p[0] = 0;
	for (ll i = 1; i <= n; i++)
		p[i] = p[i - 1] + mod(a[i] - a[i - 1]);
	
	b.resize(n + 1);
	pb.resize(n + 1);
	b[0] = pb[0] = 0;
	for (ll i = 1; i <= n; i++) {
		b[i] = a[i] - p[i];	
		pb[i] = pb[i - 1] + b[i];
	}	
	
	Tree::init(n);
}

void update(ll i) {
	while (not stk.empty() and stk.back().st >= b[i])
		stk.pob();
	ll l;
	if (stk.empty())
		l = 1;
	else
		l = stk.back().nd + 1;
	Tree::update(l, i, b[i]);
	stk.pub({b[i], i});
}

ll query(ll l, ll r) {
	if (Tree::quemin(l, r) < -p[l])
		return -1;
	
	ll ret = pb[r] - pb[l - 1];
	ret -= Tree::quesum(l, r);
	return ret / D;
}

void sweep() {
	cnt.assign(n + 1, vc<Qu>());
	for (ll i = 0; i < q; i++)
		cnt[qus[i].r].pub({qus[i].l, i});
	res.resize(q);
	for (ll i = 1; i <= n; i++) {
		update(i);
		for (auto &[l, id] : cnt[i])
			res[id] = query(l, i);
	}
}

void output() {
	for (ll i = 0; i < q; i++)
		cout << (long long)res[i] << "\n";
}

void program() {
	input();
	preprocess();
	sweep();
	output();
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	program();
	return 0;
}
#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...