Cod sursa(job #1472325)

Utilizator andrettiAndretti Naiden andretti Data 16 august 2015 23:00:32
Problema Cuburi2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include<stdio.h>
#include<algorithm>
#define maxn 250005
#define maxb 8192
using namespace std;

#define nxt if(++pos==maxb) fread(buff,1,maxb,stdin),pos=0
int n,m;
int a[maxn];
long long s[maxn],L[maxn],R[maxn];
char buff[maxb];
int pos=0;

int get()
{
    int nr=0;
    while(buff[pos]<'0' || buff[pos]>'9') nxt;
    while(buff[pos]>='0' && buff[pos]<='9'){
        nr=nr*10+buff[pos]-'0';
        nxt;
    }
    return nr;
}

void read()
{
    n=get(); m=get();
    for(int i=1;i<=n;i++)
     a[i]=get();
}

int check(int x,int y)
{
    int i,step,sol;
    for(step=1;step<y-x+1;step<<=1);

    for(i=x-1;step;step>>=1)
     if(i+step<=y)
     {
         if(s[i+step]-s[x-1]>=s[y]-s[i+step])
          sol=i+step;
         else
            i+=step;
     }

    return sol;
}

void solve()
{
    for(int i=1;i<=n;i++)
    {
        s[i]=s[i-1]+a[i];
        L[i]=L[i-1]+s[i-1];
    }

    for(int i=n;i;i--)
     R[i]=R[i+1]+s[n]-s[i];

    int x,y,pos;
    long long res;

    for(;m;m--)
    {
        x=get(); y=get();

        pos=check(x,y);
        res=L[pos]-L[x-1]-1LL*(pos-x+1)*s[x-1];
        res=res+R[pos]-R[y+1]-1LL*(y-pos+1)*(s[n]-s[y]);

        printf("%d %lld\n",pos,res);
    }
}

int main()
{
    freopen("cuburi2.in","r",stdin);
    freopen("cuburi2.out","w",stdout);

    read();
    solve();

    fclose(stdin);
    fclose(stdout);
    return 0;
}