Pagini recente » Cod sursa (job #2792375) | Cod sursa (job #1693107) | Cod sursa (job #1015303) | Cod sursa (job #345628) | Cod sursa (job #254745)
Cod sursa(job #254745)
#include <stdio.h>
#define NMAX 250010
unsigned long long ST[NMAX];
unsigned long long DR[NMAX];
unsigned long long A[NMAX];
unsigned long long S[NMAX];
unsigned long long D[NMAX];
unsigned long long N, M;
inline long long sum(unsigned long long p, unsigned long long x, unsigned long long y)
{
unsigned long long s1, s2;
s1 = DR[x] - DR[p] - ((unsigned long long) D[x] - D[p]) * (N - p + 1);
s2 = ST[y] - ST[p] - ((unsigned long long) S[y] - S[p]) * p;
return s1 + s2;
}
int main()
{
freopen("cuburi2.in", "r", stdin);
freopen("cuburi2.out", "w", stdout);
unsigned long long i, j, st, dr, mid;
unsigned long long ans, poz, l, r;
unsigned long long x, y;
scanf("%llu %llu ", &N, &M);
for (i = 1; i <= N; i++)
scanf("%llu ", &A[i]);
for (i = 1; i <= N; i++)
{
ST[i] = ST[i - 1] + A[i] * i;
S[i] = S[i - 1] + A[i];
}
for (i = N; i; i--)
{
DR[i] = DR[i + 1] + A[i] * (N - i + 1);
D[i] = D[i + 1] + A[i];
}
for (i = 1; i <= M; i++)
{
scanf("%llu %llu ", &x, &y);
st = x; dr = y;
while (st < dr - 5)
{
mid = (st + dr) / 2;
l = mid - 1;
r = mid + 1;
if (sum(l, x, y) < sum(r, x, y)) dr = r;
else st = l;
}
poz = st;
ans = sum(st, x, y);
for (j = st; j <= dr; j++)
if (sum(j, x, y) < ans)
{
ans = sum(j, x, y);
poz = j;
}
printf("%llu %llu\n", poz, ans);
}
return 0;
}