Pagini recente » Cod sursa (job #2422938) | Cod sursa (job #3216259) | Cod sursa (job #1611890) | Cod sursa (job #2947057) | Cod sursa (job #254258)
Cod sursa(job #254258)
#include <stdio.h>
#include <assert.h>
#define MAXN 250010
#define ll long long
#define FIN "cuburi2.in"
#define FOK "cuburi2.out"
int N, M, P;
ll Sol;
int A[MAXN];
ll S[MAXN], S2[MAXN], V[MAXN], V2[MAXN];
inline ll calc(int P, int x, int y)
{
return V[P] - (V[x-1] + S[x-1] * (P-x+1)) + V2[P] - (V2[y+1] + S2[y+1] * (y-P+1));
}
int main()
{
freopen(FIN, "r", stdin);
freopen(FOK, "w", stdout);
int i, x, y, front, middle, back;
scanf("%d %d ", &N, &M);
assert(1<=N && N<=250000);
assert(1<=M && M<=250000);
for (i = 1; i <= N; i++)
{
scanf("%d ", &A[i]);
assert(0<=A[i] && A[i]<=1000000);
}
for (i = 1; i <= N; i++)
{
S[i] = S[i-1] + A[i];
V[i] = V[i-1] + S[i-1];
}
for (i = N; i > 0 ; i--)
{
S2[i] = S2[i+1] + A[i];
V2[i] = V2[i+1] + S2[i+1];
}
for (i = 1; i <= M; i++)
{
scanf("%d %d ", &x, &y);
assert(1<=x && x<=y && y<=N);
front = x, back = y;
P = x;
while (front <= back)
{
middle = (front + back) / 2;
if (S[middle-1] - S[x-1] < S[y] - S[middle-1])
{
front = middle + 1;
P = middle;
}
else back = middle - 1;
}
Sol = calc(P, x, y);
printf("%d 0\n", P);
}
return 0;
}