Pagini recente » Cod sursa (job #2480523) | Cod sursa (job #342427) | Cod sursa (job #1103161) | Cod sursa (job #2700785) | Cod sursa (job #964510)
Cod sursa(job #964510)
#include <fstream>
using namespace std;
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()
{
ifstream fin("cuburi2.in");
ofstream fout("cuburi2.out");
fin >> N >> M;
for (int i = 1; i <= N; ++i)
{
fin >> S[i];
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)
{
fin >> val1 >> val2;
int step, resnow;
for (step = 1; step <= (val2 - val1 + 1); step <<= 1);
for (resnow = val1; step; step >>= 1)
if (resnow + step <= val2 && value(val1, val2, resnow + step - 1) > value(val1, val2, resnow + step))
resnow += step;
fout << resnow << ' ' << value(val1, val2, resnow) << '\n';
}
fin.close();
fout.close();
}