Cod sursa(job #254377)

Utilizator AndreyPAndrei Poenaru AndreyP Data 7 februarie 2009 11:41:49
Problema Cuburi2 Scor 50
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 2 Marime 1.18 kb
#include<stdio.h>
#define N 250010
int n,m;
int v[N];
long long s[N],ajt[N];
char c[9*N];
inline void citescv()
{
	fgets(c,9*N,stdin);
	int cate=0,aux=0;
	for(int i=0; c[i]!='\0'; ++i)
	{
		if(c[i]>='0' && c[i]<='9')
			aux=aux*10+c[i]-'0';
		else
		{
			v[++cate]=aux;
			aux=0;
		}
	}
	if(cate<n)
		v[++cate]=aux;
}
inline void citire()
{
	scanf("%d%d\n",&n,&m);
	citescv();
}
inline void precalc()
{
	for(int i=1; i<=n; ++i)
	{
		long long aux=(long long)v[i];
		s[i]=s[i-1]+aux;
		ajt[i]=ajt[i-1]+s[i-1];
	}
}
inline void rezolva()
{
	char c[30];
	fgets(c,30,stdin);
	int x=0,y=0,i=0;
	for(i=0; c[i]>='0' && c[i]<='9'; ++i)
		x=x*10+c[i]-'0';
	for(++i; c[i]>='0' && c[i]<='9'; ++i)
		y=y*10+c[i]-'0';
	int p=y;
	long long cost;
	long long aux=(long long)(y-x);
	cost=ajt[y]-ajt[x]-aux*s[x-1];
	long long cost1=cost;
	long long aux1=s[x-1]+s[y];
	for(int i=y-1; i>=x; --i)
	{
		cost1=cost1-(s[i]<<1)+aux1;
		if(cost1<cost)
		{
			p=i;
			cost=cost1;
		}
	}
	printf("%d %lld\n",p,cost);
}
int main()
{
	freopen("cuburi2.in","r",stdin);
	freopen("cuburi2.out","w",stdout);
	citire();
	precalc();
	for(; m; --m)
		rezolva();
	return 0;
}