Cod sursa(job #847720)

Utilizator stoicatheoFlirk Navok stoicatheo Data 4 ianuarie 2013 13:39:20
Problema Cuburi2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include<stdio.h>
#include<ctype.h>
 
FILE *f = fopen("cuburi2.in","r");
FILE *g = fopen("cuburi2.out","w");
 
#define MaxN 250100
#define INF 1LL<<58;
#define ll long long
#define formula (ll)(Best_S[i]-(i-x+1)*B_S[x-1]-Best_S[x-1]+Best_D[i]-(y-i+1)*B_D[y+1]-Best_D[y+1])
#define MaxS 8*MaxN
 
int N,M,Poz,a,b;
ll Sol;
int A[MaxN];
ll B_S[MaxN],B_D[MaxN],Best_S[MaxN],Best_D[MaxN];
char S[MaxS];
 
void citire(void)
{
    fscanf(f,"%d %d\n",&N,&M);
    fgets(S,sizeof(S),f);
    for(int i=0;S[i];i++)
        if(isdigit(S[i]))
            for(++A[0];isdigit(S[i]);A[A[0]] = A[A[0]]*10+S[i++]-'0');
    A[0] = 0;
}
 
void Preprocesare(void)
{
    for(int i=1;i<=N;i++)
    {
        B_S[i] = B_S[i-1]+A[i];
        Best_S[i] = Best_S[i-1]+B_S[i-1];
    }
         
    for(int i=N;i;i--)
    {
        B_D[i] = B_D[i+1]+A[i];
        Best_D[i] = Best_D[i+1]+B_D[i+1];
    }
}
 
inline ll Min(int i,int x,int y)
{
    return formula;
}
 
inline void CautBin(int li,int ls)
{
    if(li > ls)
        return ;
         
    if(B_S[(li+ls)/2-1]-B_S[a-1] < B_S[b]-B_S[(li+ls)/2-1])
    {
        Poz = (li+ls)/2;
        CautBin((li+ls)/2+1,ls);
    }
    else
        CautBin(li,(li+ls)/2-1);
}
 
void Rezolvare(void)
{
    int j;
    Preprocesare();
     
    for(int i=1;i<=M;i++)
    {
        fgets(S,sizeof(S),f);
        for(j=0,a=0;isdigit(S[j]);a = a*10+S[j++]-'0');j++;
        for(b=0;isdigit(S[j]);b=b*10+S[j++]-'0');
        CautBin(a,b);
         
        fprintf(g,"%d %lld\n",Poz,Min(Poz,a,b));
    }
}
 
int main()
{
    citire();
     
    Rezolvare();
}