Cod sursa(job #1416304)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 7 aprilie 2015 20:48:03
Problema Cuburi2 Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <stdio.h>
#include <ctype.h>
#define MAXN 250000
long long a[MAXN+1], b[MAXN+1];
FILE *fin;
inline long long suma(int x, int p, int y){
    return b[y]-b[p]+p*(a[p-1]-a[x-1]-a[y]+a[p])-b[p-1]+b[x-1];
}
inline int citeste(){
    int x=0;
    char ch=fgetc(fin);
    while(!isdigit(ch)){
        ch=fgetc(fin);
    }
    while(isdigit(ch)){
        x=10*x+ch-'0';
        ch=fgetc(fin);
    }
    return x;
}
int main(){
    int n, q, i, x, y, v, p, pas;
    FILE *fout;
    fin=fopen("cuburi2.in", "r");
    fout=fopen("cuburi2.out", "w");
    fscanf(fin, "%d%d", &n, &q);
    for(i=1; i<=n; i++){
        v=citeste();
        a[i]=a[i-1]+v;
        b[i]=b[i-1]+i*(long long)v;
    }
    for(i=0; i<q; i++){
        x=citeste();
        y=citeste();
        p=x;
        for(pas=1<<17; pas!=0; pas>>=1){
            if((p+pas<=y)&&(2*a[p+pas-1]<a[x-1]+a[y])){
                p+=pas;
            }
        }
        fprintf(fout, "%d %lld\n", p, suma(x, p, y));
    }
    fclose(fin);
    fclose(fout);
    return 0;
}