Pagini recente » Cod sursa (job #1997201) | Cod sursa (job #2216798) | Cod sursa (job #2373185) | Cod sursa (job #421462) | Cod sursa (job #964516)
Cod sursa(job #964516)
#include <cstdio>
#include <fstream>
using namespace std;
ifstream fin("cuburi2.in");
char parse[1 << 20], *now;
inline void verify()
{
if (*now == 0)
{
fin.get(parse, 1 << 20, '\0');
now = parse;
}
}
inline int get()
{
while (*now < '0' || *now > '9')
{
++now;
verify();
}
int number = 0;
while (*now >= '0' && *now <= '9')
{
number = number * 10 + (*now - '0');
++now;
verify();
}
return number;
}
int N, M;
long long S[250002], S1[250002], S2[250002];
long long value(int i1, int i2, int pos)
{
long long addleft = S1[pos - 1] - S1[i1 - 1] - (pos - i1) * S[i1 - 1];
long long addright = S2[pos + 1] - S2[i2 + 1] - (i2 - pos) * (S[N] - S[i2]);
return addleft + addright;
}
int main()
{
freopen("cuburi2.out", "w", stdout);
now = parse;
verify();
N = get();
M = get();
for (int i = 1; i <= N; ++i)
{
S[i] = get();
S[i] += S[i - 1];
}
for (int i = 1; i <= N; ++i)
S1[i] = S1[i - 1] + S[i];
for (int i = N; i >= 1; --i)
S2[i] = S2[i + 1] + (S[N] - S[i - 1]);
for (int i = 1, val1, val2; i <= M; ++i)
{
val1 = get();
val2 = get();
int step, resnow;
for (step = 1; step <= (val2 - val1 + 1); step <<= 1);
for (resnow = val1; step; step >>= 1)
if (resnow + step <= val2 && (S[resnow + step - 1] - S[val1 - 1]) < (S[val2] - S[resnow + step - 1]))
resnow += step;
printf("%d %lld\n", resnow, value(val1, val2, resnow));
}
fin.close();
}