Cod sursa(job #819409)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 18 noiembrie 2012 22:31:36
Problema Cuburi2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include<cstdio>
#include<cstring>
#define ll long long

int n,m,x,y,st,dr,st2,dr2;

ll sum[250007],s[250007],a[250007],b[250007];

inline int cb(ll k1,ll k2)
{
	
    int med=0, last=0;
	
    while (st < dr)
    {
		
        med = (dr + st) / 2;
		
	    if (sum[med] - k1 >= s[med] - k2)
		    dr = med;
		else
			st = med + 1;
		
    }
	return st;
	
}


long parsare()
{
	
	char s[10];
	
	memset(s,0,sizeof(s));
	
	long k=0;
	
	scanf("%s",s);
	
	for (int i=strlen(s)-1;i>=0;--i)
		k=k*10+s[i]-'0';

	return k;
	
}

int main()
{
	
    freopen("cuburi2.in","r",stdin);
	freopen("cuburi2.out","w",stdout);
	
	n=parsare();
	
	m=parsare();
	
	scanf("\n");
	
	ll max=0,min=0,min2;
	
	for (int i=1;i<=n;++i)
	{
		
    	a[i]=parsare();
		
		scanf(" ");
		
		max+=a[i];
		
    }
	
	scanf("\n");
	
	//sume partiale
	
    for (int i=1;i<=n;++i)
	{
		
		sum[i]=sum[i-1]+a[i];
		
		s[i]=max-sum[i];
		
    }
	
	for (int i=1;i<=n;++i)
		a[i]=a[i-1]+sum[i-1];
	
	for (int i=n;i>0;--i)
		b[i]=b[i+1]+s[i];
	
	for (int i=1;i<=m;i++)
	{
		
		st=parsare();
		
		scanf(" ");
		
		dr=parsare();
		
		scanf("\n");
		
		st2=st;
		
		dr2=dr;
		
		min=cb(sum[st2-1],s[dr2]);
		
		st=st2;
		
		dr=dr2;
		
		min2=(ll)a[min]-a[st]-sum[st-1]*(min-st)+b[min]-b[dr]-s[dr]*(dr-min);
		
		printf("%d ",min);
		
		printf("%lld\n",min2);
		
    }
}