Pagini recente » Cod sursa (job #2305587) | Cod sursa (job #1737441) | Cod sursa (job #3122091) | Cod sursa (job #2227148) | Cod sursa (job #254553)
Cod sursa(job #254553)
#include <stdio.h>
#define nmax (1<<18)
#define infinit 2000000000
int turn[nmax];
int sumad[nmax], sumas[nmax], cd[nmax], cs[nmax];
int N, M, left, left2, right, right2, leftThird, rightThird, final, valfinal, vx, vy, vz, fz;
int evalu(int mid, int left, int right)
{
int 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()
{
int i;
freopen("cuburi2.in", "r", stdin);
freopen("cuburi2.out", "w", stdout);
scanf("%d%d", &N, &M);
for (i = 1; i <= N; ++i)
scanf("%d", &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("%d%d", &left2, &right2);
for (left = left2, right = right2, valfinal = infinit, final = i = 0; left <= right && i < 32; ++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("%d %d\n", final, valfinal);
}
return 0;
}