Cod sursa(job #3331610)

Utilizator alexiam5656Alexia Mitrache alexiam5656 Data 29 decembrie 2025 13:33:57
Problema Cuburi2 Scor 100
Compilator c-64 Status done
Runda Arhiva de probleme Marime 2.01 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>

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 = (dr + st) / 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;
    fscanf(fin, "%d %d", &n, &m);

    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++)
    {
        int val;
        fscanf(fin, "%d", &val);
        sp[i] = sp[i - 1] + val;
        ssp[i] = ssp[i - 1] + (long long)i * val;
    }

    for (int i = 1; i <= m; i++)
    {
        int x, y;
        if (fscanf(fin, "%d %d", &x, &y) != 2) break;
        
        int p = find_pos(x, y, sp);
        
        long long s1 = 0, s2 = 0;
        
        long long suma_inaltimi_st = sp[p - 1] - sp[x - 1];
        long long suma_ponderata_st = ssp[p - 1] - ssp[x - 1];

        if (x < p) {
            s1 = (long long)p * suma_inaltimi_st - suma_ponderata_st;
        }
        
        long long suma_inaltimi_dr = sp[y] - sp[p];
        long long suma_ponderata_dr = ssp[y] - ssp[p];
        
        if (p < y) {
            s2 = suma_ponderata_dr - (long long)p * suma_inaltimi_dr;
        }
        
        fprintf(fout, "%d %lld\n", p, s1 + s2);
    }

    fclose(fin);
    fclose(fout);
    free(sp);
    free(ssp);
    return 0;
}