Pagini recente » Cod sursa (job #1540105) | Cod sursa (job #2500644) | Cod sursa (job #526402) | Cod sursa (job #797096) | Cod sursa (job #3343255)
#include <fstream>
#include <iostream>
using namespace std;
ifstream fin("cuburi2.in");
ofstream fout("cuburi2.out");
const int Nmax = 250000 + 5;
int v[Nmax], n, m;
long long sp[Nmax], pre[Nmax], suf[Nmax], sp2[Nmax];
long long calcPre(int st, int dr)
{
if ( st > dr )
return 0;
return pre[dr] - pre[st - 1] - (dr - st + 1) * sp[st - 1];
}
long long calcSuf(int st, int dr )
{
if (st > dr )
return 0;
// cout << suf[st] << " " << suf[dr + 1] << endl;
return suf[st] - suf[dr + 1] - (sp[n] - sp[dr]) *(dr - st + 1);
}
int main()
{
int i;
fin >> n >> m;
for ( i = 1; i <= n; ++i )
{
fin >> v[i];
sp[i] = sp[i - 1] + v[i];
pre[i] = pre[i - 1] + sp[i];
}
long long sum = 0;
for ( i = n; i >= 1; --i )
{
sum = sum + v[i];
suf[i] = suf[i + 1] + sum;
}
for ( i = 1; i <= m; ++i )
{
int st, dr, mij, x, y;
fin >> x >> y;
st = x;
dr = y;
int sol = x - 1;
long long s = (sp[dr] - sp[st - 1]);
while ( st <= dr )
{
mij = (st + dr) / 2;
if (2 * (sp[mij] - sp[x - 1]) <= s )
{
sol = mij;
st = mij + 1;
}
else
dr = mij - 1;
}
if (sol < y) {
sol++;
}
fout << sol << ' ' << calcPre(x, sol - 1) + calcSuf(sol + 1, y) << '\n';
}
return 0;
}