Cod sursa(job #2129099)

Utilizator shantih1Alex S Hill shantih1 Data 12 februarie 2018 15:20:12
Problema Cuburi2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.86 kb
#include <iostream>
#include <fstream>
#define max 250005
using namespace std;
long long s[max],r[max],l[max],mx,r1,r2,h;
int n,m,x,y,i,dr,st,mid,pos;
int main() {
	
	freopen("cuburi2.in", "r", stdin);
	freopen("cuburi2.out", "w", stdout);
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)
	{
		scanf("%lld", &r[i]);
		s[i]=s[i-1]+r[i];
		l[i]=l[i-1]+i*r[i];
	}
	for(i=n;i>=1;i--)
		r[i]=r[i+1]+r[i]*(n-i+1);
	
	while(m)
	{
		m--;
		scanf("%d%d", &x, &y);
		st=x;   dr=y;
		while(st<=dr)
		{
			mid=st+(dr-st)/2;
			if(s[mid]-s[x-1]>=s[y]-s[mid])
			{
				dr=mid-1;
				if(s[y]-s[mid-1]>s[mid-1]-s[x-1])    st=dr+1;
			}
			else                            st=mid+1;
		}
		
		mx=r[x]-r[mid]-(n-mid+1)*(s[mid-1]-s[x-1])+l[y]-l[mid]-mid*(s[y]-s[mid]);
		if(s[mid]-s[x-1]<s[y]-s[mid]&&mid<y)
		{   
			mx=mx+(s[mid]-s[x-1])-(s[y]-s[mid]);
			mid++;
		}
		printf("%d %lld\n", mid, mx);
	}
}