Cod sursa(job #278919)

Utilizator Myha3Lacazacu mihaela Myha3La Data 12 martie 2009 16:46:03
Problema Cuburi2 Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <cstdio>   
#include <cstdlib>   
#include <ctime>   
  
using namespace std;   
  
const int maxN = 250001;   
const long long oo = 1LL << 60;   
  
long long Sum[maxN], Sum2[maxN], InvSum[maxN], InvSum2[maxN];   
int V[maxN], N, M;   
  
inline long long min(long long a, long long b){   
    if (a < b)   
        return a;   
    return b;   
}   
  
long long SumaStg(int x, int y){   
    return (Sum2[y] - Sum2[x - 1]) - 1LL * (y - x + 1) * Sum[x - 1];   
}   
long long SumaDr(int x, int y){   
    return (InvSum2[x] - InvSum2[y + 1]) - 1LL * (y - x + 1) * InvSum[y + 1];   
}   
  
inline long long SumaPe(int a, int b, int i){   
    int nr;   
    long long st, dr;   
    if (i == a)   
        return SumaDr(a + 1, b);   
    if (i == b)   
        return SumaStg(a, b - 1);   
    st = SumaStg(a, i - 1);   
    dr = SumaDr(i + 1, b);   
    //printf("(%d %d %d %lld %lld)\n",a, b, i, st, dr);   
    return st + dr;   
}   
void baga_brut(int a, int b){   
    int i, nr, poz;   
    long long st, dr, minim = oo, x;   
  
    nr = b - a;   
  
    for (i = a ; i <= b; ++i){   
        x = SumaPe(a, b, i);   
        if (x < minim){   
            minim = x;   
            poz = i;   
        }   
    }   
    printf("%d %lld\n", poz ,minim);   
}   
  
void baga_marfa(int a, int b){   
}   
int main(){   
    int i, a, b;   
  
    freopen("cuburi2.in", "r", stdin);   
    freopen("cuburi2.out", "w", stdout);   
  
    scanf("%d%d", &N, &M);   
  
    for (i = 1; i <= N; ++i){   
        scanf("%d", &V[i]);   
        Sum[i] = Sum[i - 1] + V[i];   
        Sum2[i] = Sum2[i - 1] + Sum[i];   
    }   
    for (i = N; i; --i){   
        InvSum[i] = InvSum[i + 1] + V[i];   
        InvSum2[i] = InvSum2[i + 1] + InvSum[i];   
    }   
    while (M --){   
        scanf("%d%d", &a, &b);   
        if (M <= 5000)   
            baga_brut(a, b);   
        else  
            baga_marfa(a, b);   
    }   
  
    /*for (i = 1; i <= N; ++i)  
        printf("%d ", InvSum[i]);  
    puts("");  
 
    for (i = 1; i <= N; ++i)  
        printf("%d ", InvSum2[i]);  
    puts("");*/  
    //fprintf(stderr, "%lld %lld ", SumaStg(1,2), SumaDr(4,5));   
}