Cod sursa(job #1501139)

Utilizator RodoetTeodor Darie Rodoet Data 13 octombrie 2015 00:15:01
Problema Cuburi2 Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("cuburi2.in");
ofstream out("cuburi2.out");
long long n,m,poz,x,y,i,costfinalst,costfinaldr;
long long inaltimi[250002], sumast[250002], costst[250002], sumadr[250002], costdr[250002];
void cautpoz(long long st, long long dr)
{
	long long mij;
	mij = (st+dr)/2;
	if (st>dr)
	{
		return;
	}
	if (sumast[mij-1]-sumast[x-1]<sumast[y]-sumast[mij-1])
	{
		poz=mij;
		cautpoz(mij+1,dr);
	}
	else 
	{
		cautpoz(st,mij-1);
	}
}
int main ()
{
	in>>n>>m;
	for (i=1;i<=n;i++)
	{
		in>>inaltimi[i];
		sumast[i]=sumast[i-1]+inaltimi[i];
		costst[i]=costst[i-1]+sumast[i-1];
	}
	for (i=n;i>0;i--)
	{
		sumadr[i]=sumadr[i+1]+inaltimi[i];
		costdr[i]=costdr[i+1]+sumadr[i+1];
	}
	for (i=1;i<=m;i++)
	{
		in>>x>>y;
		if(x>y)
		{
			int t=x;
			x=y;
			y=t;
		}
		cautpoz(x,y);
		costfinalst = costst[poz]-(poz-x)*sumast[x-1]-costst[x];
		costfinaldr = costdr[poz]-(y-poz)*sumadr[y+1]-costdr[y];
		out<<poz<<' '<<costfinalst+costfinaldr;
		out<<endl;
	}
	return 0;
}