Cod sursa(job #1201076)

Utilizator enedumitruene dumitru enedumitru Data 24 iunie 2014 14:13:51
Problema Cuburi2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include<cstdio>
#include <fstream>
#define Nmax 250002
#define ll long long
using namespace std;
ifstream fin("cuburi2.in");
int n,m,p,x,y,i,step,a[Nmax];
ll nr,ss[Nmax],sd[Nmax],ts[Nmax],td[Nmax];
char parse[1<<20],*now;
inline void verify()
{   if (*now == 0) fin.get(parse,1<<20,'\0'), now = parse;}
inline int get()
{    while(*now<'0'||*now>'9') ++now, verify();
    int number = 0;
    while (*now >= '0' && *now <= '9')
    {	number = number * 10 + (*now - '0');
        ++now; verify();
    }
    return number;
}
int main()
{   freopen("cuburi2.out","w",stdout);
	now=parse; verify();
    n=get(); m=get();
    for(i=1;i<=n;++i) {a[i]=get(); ss[i]=ss[i-1]+a[i]; ts[i]=ts[i-1]+ss[i];}
    for(i=n;i;--i) {sd[i]=sd[i+1]+a[i]; td[i]=td[i+1]+sd[i];}
    while(m--)
    {   x=get(); y=get();
		for(step=1;step<y-x;step<<=1);
		for(p=x;step;step>>=1)
            if(p+step<=y&&ss[p+step-1]-ss[x-1]<sd[p+step]-sd[y+1]) p+=step;
		nr=ts[p-1]-ts[x-1]-ss[x-1]*(p-x)+td[p+1]-td[y+1]-sd[y+1]*(y-p);	
        printf("%d %lld\n",p,nr);
    }
    return 0;
}