Cod sursa(job #1890494)

Utilizator silkMarin Dragos silk Data 23 februarie 2017 12:16:31
Problema Cuburi2 Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <cstdio>
#define NMax 250000
#define ll long long

ll spec[2][NMax+1];
ll sum[2][NMax+1];
int v[NMax+1];

int main(){
    FILE* fin = fopen("cuburi2.in","r");
    FILE* fout = fopen("cuburi2.out","w");

    int i,N,T,X,Y,st,dr,mid,pos;
    ll left,right;

    fscanf(fin,"%d %d",&N,&T);
    for(i = 1; i <= N; ++i) fscanf(fin,"%d",&v[i]);
    for(i = 1; i <= N; ++i)
    {
        sum[0][i] = sum[0][i-1] + v[i];
        spec[0][i] = spec[0][i-1] + sum[0][i-1];
    }
    for(i = N; i >= 1; --i)
    {
        sum[1][i] = sum[1][i+1] + v[i];
        spec[1][i] = spec[1][i+1] + sum[1][i+1];
    }

    while(T--)
    {
        fscanf(fin,"%d %d",&X,&Y);
        for(pos = st = X, dr = Y; st <= dr; )
        {
            mid = (st+dr)/2;
            if(sum[0][mid]-sum[0][X-1] > sum[0][Y]-sum[0][mid]) dr = mid-1;
            else{ pos = mid+1; st = mid+1; }
        }
        left = spec[0][pos] - spec[0][X] - (pos-X) * sum[0][X-1];
        right = spec[1][pos] - spec[1][Y] - (Y-pos) * sum[1][Y+1];
        fprintf(fout,"%d %lld\n",pos,left+right);
    }


return 0;
}