Submission #1284880

#TimeUsernameProblemLanguageResultExecution timeMemory
1284880MuhammadSaramFish 3 (JOI24_fish3)C++20
44 / 100
1447 ms37360 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long
#define endl '\n'
#define all(v) v.begin(), v.end()

const int M = 3e5 + 1;

int seg[M*2], lz[M*2];

void push(int v,int s,int e)
{
	int mid=(s+e)/2, lc=v+1, rc=v+(mid-s)*2;
	seg[lc]=lz[v]*(mid-s), seg[rc]=lz[v]*(e-mid);
	lz[lc]=lz[rc]=lz[v];
	lz[v]=-1;
}

void modify(int l,int r,int x,int v=0,int s=0,int e=M)
{
	if (l>=e or r<=s) return;
	if (l<=s && e<=r)
	{
		seg[v]=x*(e-s), lz[v]=x;
		return;
	}
	int mid=(s+e)/2, lc=v+1, rc=v+(mid-s)*2;
	if (~lz[v]) push(v,s,e);
	modify(l,r,x,lc,s,mid);
	modify(l,r,x,rc,mid,e);
	seg[v]=seg[lc]+seg[rc];
}

int get(int l,int r,int v=0,int s=0,int e=M)
{
	if (l>=e or r<=s) return 0;
	if (l<=s && e<=r) return seg[v];
	int mid=(s+e)/2, lc=v+1, rc=v+(mid-s)*2;
	if (~lz[v]) push(v,s,e);
	return get(l,r,lc,s,mid)+get(l,r,rc,mid,e);
}

signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(NULL), cout.tie(NULL);
	
	for (int i=0;i<M*2;i++) lz[i]=-1;
	
	int n,d;
	cin>>n>>d;
	int a[n];
	for (int i=0;i<n;i++)
		cin>>a[i];
	if (n<=3000)
	{
		int q;
		cin>>q;
		int val[n];
		while (q--)
		{
			int l,r;
			cin>>l>>r;l--;
			bool pos=1;
			int cnt=0;
			for (int i=l;i+1<r && pos;i++)
			{
				val[i]=a[i]/d-cnt;
				if (a[i+1]%d<a[i]%d) cnt++;
			}
			val[r-1]=a[r-1]/d-cnt;
			for (int i=l;i<r;i++)
				if (val[i]<0) pos=0;
			if (!pos)
			{
				cout<<-1<<endl;
				continue;
			}
			int ans=0,mn=val[r-1];
			for (int i=r-1;i>=l;i--)
				mn=min(mn,val[i]), ans+=val[i]-mn;
			cout<<ans<<endl;
		}
	}
	else if(d==1)
	{
		int q;
		cin>>q;
		int ans[q], pre[n+1]={};
		vector<pair<int,int>> v[n];
		for (int i=0;i<q;i++)
		{
			int l,r;
			cin>>l>>r;l--,r--;
			v[r].push_back({l,i});
		}
		stack<pair<int,int>> st;
		st.push({-1,-1});
		for (int i=0;i<n;i++)
		{
			pre[i+1]=pre[i]+a[i];
			while (!st.empty() && st.top().first>=a[i])
				st.pop();
			modify(st.top().second+1, i+1, a[i]);
			for (auto [l,id]:v[i])
				ans[id]=pre[i+1]-pre[l]-get(l,i+1);
			st.push({a[i],i});
		}
		for (int i=0;i<q;i++)
			cout<<ans[i]<<endl;
	}
	else
	{
		int pre[n+1]={};
		vector<int> v;
		for (int i=0;i<n;i++)
		{
			pre[i+1]=pre[i]+a[i];
			if (!a[i]) v.push_back(i);
		}
		int q;
		cin>>q;
		while (q--)
		{
			int l,r;
			cin>>l>>r;l--;
			int x=lower_bound(all(v),r)-begin(v),ans=0;
			if (x && pre[v[x-1]]>pre[l])
				ans=(d>1?-1:pre[v[x-1]]-pre[l]);
			cout<<ans<<endl;
		}
	}
	
	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...