Pagini recente » Cod sursa (job #2920514) | Cod sursa (job #2432315) | Cod sursa (job #1464400) | Cod sursa (job #771220) | Cod sursa (job #3331606)
/******************************************************************************
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;
}