Pagini recente » Cod sursa (job #1417846) | Cod sursa (job #1094428) | Cod sursa (job #2746527) | Borderou de evaluare (job #1327662) | Cod sursa (job #3331609)
/******************************************************************************
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);
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, "%lld\n", s1+s2);
}
fclose(fin);
fclose(fout);
free(sp),free(ssp);
return 0;
}