Submission #1161863

#TimeUsernameProblemLanguageResultExecution timeMemory
1161863irmuunFish 3 (JOI24_fish3)C++20
28 / 100
297 ms42388 KiB
#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define pb push_back
#define ff first
#define ss second
#define all(s) s.begin(),s.end()
#define rall(s) s.rbegin(),s.rend()

struct segtree{
	ll n;
	vector<ll>d;
	segtree(ll n){
		d.resize(4*n);
	}
	ll query(ll v,ll l,ll r,ll L,ll R){
		if(R<L||r<L||R<l) return 0;
		if(L<=l&&r<=R) return d[v];
		ll mid=(l+r)>>1;
		return query(v<<1,l,mid,L,R)+query(v<<1|1,mid+1,r,L,R);
	}
	void update(ll v,ll l,ll r,ll pos,ll val){
		if(r<pos||pos<l) return;
		if(l==r){
			d[v]=val;
			return;
		}
		ll mid=(l+r)>>1;
		update(v<<1,l,mid,pos,val);
		update(v<<1|1,mid+1,r,pos,val);
		d[v]=d[v<<1]+d[v<<1|1];
	}
};

int main(){
	ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	ll n,d;
	cin>>n>>d;
	ll c[n+5],pre[n+5];
	pre[0]=0;
	for(ll i=1;i<=n;i++){
		cin>>c[i];
		pre[i]=pre[i-1]+c[i];
	}
	ll q;
	cin>>q;
	vector<array<ll,3>>que;
	vector<ll>ans(q);
	for(ll i=0;i<q;i++){
		ll l,r;
		cin>>l>>r;
		que.pb({r,l,i});
	}
	segtree sg(n);
	sort(all(que));
	ll cur=0,sum=0;
	vector<array<ll,3>>v;
	for(ll R=1;R<=n;R++){
		sum+=c[R];
		ll cnt=1;
		while(!v.empty()){
			if(v.back()[2]>=c[R]){
				cnt+=v.back()[1]-v.back()[0]+1;
				v.pop_back();
			}
			else break;
		}
		v.pb({R-cnt+1,R,c[R]});
		sg.update(1,0,n-1,v.size()-1,(pre[R]-pre[R-cnt])-cnt*c[R]);
		while(cur<q&&que[cur][0]==R){
			auto [r,l,j]=que[cur++];
			array<ll,3>p;
			p={l,n+5,0ll};
			auto it=upper_bound(all(v),p)-v.begin();
			ans[j]+=sg.query(1,0,n-1,it,v.size()-1);
			ll L;
			if(it==v.size()){
				L=R+1;
			}
			else{
				L=v[it][0];
			}
			it--;
			ans[j]+=(pre[L-1]-pre[l-1])-(L-l)*v[it][2];
		}
	}
	for(ll i=0;i<q;i++){
		cout<<ans[i]<<"\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...