Cod sursa(job #2128496)

Utilizator shantih1Alex S Hill shantih1 Data 11 februarie 2018 19:28:15
Problema Cuburi2 Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <ctime>
#include <cstdlib>
#define max 250005
using namespace std;
ifstream fin("cuburi2.in");
ofstream fout("cuburi2.out");

long long n,m,x,y,i,v[max],dr,st,mid,pos,s[max],r[max],l[max],mx,r1,r2;
int main() {
	
	fin>>n>>m;
	for(i=1;i<=n;i++)
	{
		fin>>v[i];
		s[i]=s[i-1]+v[i];
		l[i]=l[i-1]+i*v[i];
	}
	for(i=n;i>=1;i--)
		r[i]=r[i+1]+v[i]*(n-i+1);
	
	while(m)
	{
		m--;
		fin>>x>>y;
		st=x;	dr=y;
		mx=r[1]+l[n];
		while(st<=dr)
		{
			mid=st+(dr-st)/2;
			r1=r[x]-r[mid]-(n-mid+1)*(s[mid-1]-s[x-1])+l[y]-l[mid]-mid*(s[y]-s[mid]);
			r2=r[x]-r[mid+1]-(n-mid)*(s[mid]-s[x-1])+l[y]-l[mid+1]-(mid+1)*(s[y]-s[mid+1]);
			if(r1<=r2)   dr=mid-1;
			if(r1>r2)    st=mid+1;
		}
		mx=r1;	pos=mid;
		r2=r[x]-r[mid+1]-(n-mid)*(s[mid]-s[x-1])+l[y]-l[mid+1]-(mid+1)*(s[y]-s[mid+1]);
		if(r2<mx&&mid+1<=y)
		{	mx=r2;	pos=mid+1;	}
		mid=pos-1;
		r1=r[x]-r[mid]-(n-mid+1)*(s[mid-1]-s[x-1])+l[y]-l[mid]-mid*(s[y]-s[mid]);
		if(r1<mx&&mid>=x)
		{	mx=r1;	pos=mid;	}
		
		fout<<pos<<" "<<mx<<"\n";
	}
}