Submission #981137

#TimeUsernameProblemLanguageResultExecution timeMemory
981137aymanrsFish 3 (JOI24_fish3)C++14
100 / 100
222 ms56404 KiB
#include<bits/stdc++.h>
using namespace std;
struct que{
	int l, r, id;
};
void f(int l, int r, list<que>& v, long long a[], long long ans[], long long c[]){
	if(l==r){
		for(auto& i : v){
			ans[i.id] = 0;
		}
		return;
	}
	int m = l+r>>1;
	list<que> L, R, M;
	for(const que& i : v){
		if(i.r <= m) L.push_back(i);
		else if(i.l > m) R.push_back(i);
		else M.push_back(i);
	}
	v.clear();
	f(l, m, L, a, ans, c);
	f(m+1, r, R, a, ans, c);
	long long S = 0;
	vector<pair<long long, int>> p;
	stack<pair<long long, int>> s;
	long long fs[r-m], Fs[r-m];
	for(int i = m+1;i <= r;i++){
		if(i==m+1) Fs[i-m-1]=0;
		else Fs[i-m-1] = Fs[i-m-2]; 
		if(a[i] <= 0) {
			S -= i*a[i];
			long long k = -a[i];
			while(!s.empty() && k){
				if(k >= s.top().first) {
					k -= s.top().first;
					S -= s.top().first*s.top().second;
					s.pop();
				}
				else {
					S -= k*s.top().second;
					s.top().first -= k;
					k = 0;
					break;
				}
			}
			Fs[i-m-1] += k;
		} else s.push({a[i], i});
		fs[i-m-1] = S;
	}
	S = 0;long long g = 0;
	int pt = m;
	vector<array<long long, 3>> bs = {{0, 0, -1}};
	for(auto& q : M){
		while(pt > q.l){
			if(a[pt] <= 0){
				g -= a[pt];
				S -= a[pt]*pt;
			} else {
				long long k = a[pt];
				if(g >= k){
					g -= k;
					S -= k*pt;
					pt--;
					continue;
				}
				S -= g*pt;
				k -= g;
				g = 0;
				bs.back()[2] = pt;
				bs.push_back({bs.back()[0]+k, bs.back()[1]-k*pt, -1});
			}
			pt--;
		}
		long long k = c[pt];
		if(g > k || k+bs.back()[0]-g < Fs[q.r-m-1]){
			ans[q.id] = -1;
			continue;
		}
		if(!Fs[q.r-m-1]){
			ans[q.id] = S-g*pt+fs[q.r-m-1];
			continue;
		}
		bs.back()[2] = pt;
		int low = 0, high = bs.size()-1, best = 0;
		while(low<=high){
			int mid = low+high>>1;
			if(bs[mid][0] >= Fs[q.r-m-1]) {
				high=mid-1;
			} else {
				best = mid;
				low = mid+1;
			}
		}
		ans[q.id] = S-g*pt+fs[q.r-m-1]+bs[best][1]-(Fs[q.r-m-1]-bs[best][0])*bs[best][2];
	}
}
void solve(){
	int n;long long d;cin >> n >> d;
	long long a[n+1], c[n+1];a[0]=0;
	for(int i = 1;i <= n;i++) {
		cin >> a[i];
		c[i] = a[i];
	}
	for(int i = n;i >= 1;i--) {
		a[i] = a[i]-a[i-1];
		if(a[i] < 0){
			a[i] = -a[i];
			a[i] = (a[i]+d-1)/d;
			a[i] = -a[i];
		} else a[i] /= d;
		c[i] /= d;
	}
	int q;cin >> q;
	vector<que> qv;
	for(int i = 0;i < q;i++){
		int l, r;cin >> l >> r;
		qv.push_back({l, r, i});
	}
	sort(qv.begin(), qv.end(), [](const auto& a, const auto& b){
		return a.l > b.l;
	});
	long long ans[q];
	list<que> lv(qv.begin(), qv.end());
	f(1, n, lv, a, ans, c);
	for(int i = 0;i < q;i++) cout << ans[i] << '\n';


}
int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	solve();
}

Compilation message (stderr)

Main.cpp: In function 'void f(int, int, std::__cxx11::list<que>&, long long int*, long long int*, long long int*)':
Main.cpp:13:11: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   13 |  int m = l+r>>1;
      |          ~^~
Main.cpp:86:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   86 |    int mid = low+high>>1;
      |              ~~~^~~~~
#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...