Submission #988469

#TimeUsernameProblemLanguageResultExecution timeMemory
988469amirhoseinfar1385Fish 3 (JOI24_fish3)C++17
100 / 100
251 ms40544 KiB
#include<bits/stdc++.h>
using namespace std;
const long long maxn=300000+10;
long long n,q,d,all[maxn],res[maxn],suma[maxn],kaf=(1<<19);
vector<pair<long long,long long>>qu[maxn];
vector<long long>na;

struct fenwick{
	long long fen[maxn];
	void ins(long long i,long long w){
		i++;
		while(i<maxn){
			fen[i]+=w;
			i+=((-i)&i);
		}
	}
	long long pors(long long i){
		long long ret=0;
		i++;
		while(i>0){
			ret+=fen[i];
			i-=((-i)&i);
		}
		return ret;
	}
}fensuma,fenssum,fensumkam;

void vorod(){
	cin>>n>>d;
//	if(n>3000){
//		exit(0);
//	}
	for(long long i=1;i<=n;i++){
		cin>>all[i];
	}
	cin>>q;
	for(long long i=0;i<q;i++){
		long long l,r;
		cin>>l>>r;
		qu[r].push_back(make_pair(l,i));
	}
}

void ins(long long ind,long long w){
	fensuma.ins(na.back()+1,w);
	fensuma.ins(ind+1,-w);
	fenssum.ins(na.back()+1,w*ind);
	fenssum.ins(ind+1,-w*ind);
	fensumkam.ins(0,w*(ind-na.back()));
	fensumkam.ins(na.back()+1,-w*(ind-na.back()));
//	for(long long i=ind;i>na.back();i--){
//		suma[i]+=w;
//	}
}

long long check(long long ind){
	/*long long ted=suma[ind+1];
	long long z=all[ind]-suma[ind+1]*d;
	if(z>=all[ind-1]){
		return -1;
	}
	ted=(all[ind-1]-z)/d;
	if((all[ind-1]-z)%d!=0){
		ted++;
	}
	return ted;*/
	long long ted=0;
	long long z=all[ind]-fensuma.pors(ind+1)*d;
	if(z>=all[ind-1]){
		return -1;
	}
	ted=(all[ind-1]-z)/d;
	if((all[ind-1]-z)%d!=0){
		ted++;
	}
	return ted;
}


long long pors(long long ind){
	long long ret=0;
//	for(long long i=ind+1;i<=n;i++){
//		ret+=fensuma.pors(i);
//	}
	ret=fensumkam.pors(ind)+fenssum.pors(ind)-fensuma.pors(ind)*ind;
	if(fensuma.pors(ind+1)*d>all[ind]){
		return -1;
	}
	return ret;
}

void solve(){
	na.push_back(1);
	for(long long i=2;i<=n;i++){
		if(all[i]<all[i-1]){
			long long ted=(all[i-1]-all[i])/d;
			if((all[i-1]-all[i])%d!=0){
				ted++;
			}
			if(ted>0){
				ins(i,ted);
			}
			while((long long)na.back()>1){
				long long z=check(na.back());
				if(z==-1){
					break;
				}
				long long last=na.back();
				na.pop_back();
				ins(last,z);
			}
		}else{
			na.push_back(i);
		}
		for(auto x:qu[i]){
			res[x.second]=pors(x.first);
		}
	}
}

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

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
//	freopen("inp.txt","r",stdin);
	vorod();
//	pre();
	solve();
	khor();
}
#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...