Cod sursa(job #3331606)

Utilizator alexiam5656Alexia Mitrache alexiam5656 Data 29 decembrie 2025 13:24:06
Problema Cuburi2 Scor 67
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.7 kb
/******************************************************************************

                            Online C Compiler.
                Code, Compile, Run and Debug C program online.
Write your code in this editor and press "Run" button to compile and execute it.

*******************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#define NMAX 250000

int find_pos(int x, int y, long long *sp)
{
    long long total = sp[y] - sp[x - 1];
    long long need = (total + 1) / 2;

    int st = x, dr = y, ans = y;
    while (st <= dr)
    {
        int mid = (st + dr) / 2;
        if (sp[mid] - sp[x - 1] >= need)
        {
            ans = mid;
            dr = mid - 1;
        }
        else
            st = mid + 1;
    }
    return ans;
}
int main(void)
{
    FILE *fin=fopen("cuburi2.in", "r");
    FILE *fout=fopen("cuburi2.out", "w");
    int n,m,x,y;
    fscanf(fin, "%d %d", &n, &m);
    int val;
    long long s1=0,s2=0;
    long long *sp=(long long*)calloc(n+1, sizeof(long long));
    long long *ssp = (long long *)calloc(n + 1, sizeof(long long));
    for(int i =1;i<=n;i++)
    {
        fscanf(fin, "%d", &val);
        sp[i]=sp[i-1]+val;
        ssp[i] = ssp[i - 1] + i*val;
    }
    for(int i =1;i<=m;i++)
    {
        s1=0,s2=0;
        fscanf(fin, "%d %d", &x, &y);
        int p=find_pos(x,y,sp);
        fprintf(fout, "%d ", p);
        if (x < p) {
            s1 = 1LL * p * (sp[p - 1] - sp[x - 1]) - (ssp[p - 1] - ssp[x - 1]);
        }
        if (p < y) {
            s2 = (ssp[y] - ssp[p]) - 1LL * p * (sp[y] - sp[p]);
        }
        fprintf(fout, "%lld\n", s1+s2);
    }
    fclose(fin);
    fclose(fout);
    free(sp),free(ssp);
    return 0;
}