Pagini recente » Cod sursa (job #2029644) | Cod sursa (job #1239141) | Cod sursa (job #2376720) | Cod sursa (job #2181772) | Cod sursa (job #254885)
Cod sursa(job #254885)
#include <stdio.h>
#define nmax (250005)
unsigned long long turn[nmax];
unsigned long long sumad[nmax], sumas[nmax];
unsigned long long cd[nmax], cs[nmax];
unsigned long long N, M, left, left2, right, right2, leftThird, rightThird, final, valfinal, vx, vy, vz, fz;
unsigned long long evalu(unsigned long long mid, unsigned long long left, unsigned long long right)
{
unsigned long long cdij, csij;
cdij = cd[mid-1] - cd[left-1] - (mid-left)*sumad[left-1];
csij = cs[mid+1] - cs[right+1] - (right-mid)*sumas[right+1];
return cdij+csij;
}
int main()
{
unsigned long long i;
freopen("cuburi2.in", "r", stdin);
freopen("cuburi2.out", "w", stdout);
scanf("%llu%llu", &N, &M);
for (i = 1; i <= N; ++i)
scanf("%llu", &turn[i]);
for (i = 1; i <= N; ++i)
sumad[i] = sumad[i-1] + turn[i];
for (i = N; i >= 1; i--)
sumas[i] = sumas[i+1] + turn[i];
for (i = 1; i <= N; ++i)
cd[i] = cd[i-1] + sumad[i];
for (i = N; i >= 1; i--)
cs[i] = cs[i+1] + sumas[i];
while (M--)
{
scanf("%llu%llu", &left2, &right2);
for (left = left2, right = right2, valfinal = cd[N] + cs[1], final = i = 0; left <= right && i < 36; ++i )
{
leftThird = (2*left + right) / 3;
rightThird = (left + 2*right) / 3;
fz = (left + right) / 2;
if ((vz = evalu(final, left2, right2)) < valfinal)
{
valfinal = vz;
final = fz;
}
if ((vx = evalu(leftThird, left2, right2)) < valfinal)
{
valfinal = vx;
final = leftThird;
}
if ((vy = evalu(rightThird, left2, right2)) < valfinal)
{
valfinal = vy;
final = rightThird;
}
if (vx < vy)
right = rightThird-1;
else
left = leftThird+1;
}
printf("%llu %llu\n", final, valfinal);
}
return 0;
}