Pagini recente » Cod sursa (job #1626117) | Cod sursa (job #1301850) | Cod sursa (job #2856261) | Cod sursa (job #2233238) | Cod sursa (job #2253759)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("cuburi2.in");
ofstream out("cuburi2.out");
const int maxn = 250005;
long long distdr[maxn];
long long dist[maxn];
long long sp[maxn];
int v[maxn];
int n;
void solve()
{
int x, y;
in >> x >> y;
if(x == y)
{
out << x << " " << 0 << "\n";
return;
}
long long aux = (sp[y] - sp[x - 1]) / 2;
int st = x;
int dr = y;
int med = 0;
while(st <= dr)
{
int mij = (st + dr) / 2;
if(sp[mij - 1] - sp[x - 1] < aux)
{
med = mij;
st = mij + 1;
}
else
dr = mij - 1;
}
out << med << " ";
out << dist[med] - (dist[x] + sp[x - 1] * (med - x)) + distdr[med] - (distdr[y] + (sp[n] - sp[y]) * (y - med)) << "\n";
/// stanga fara cele din stanga + dreapta fara cele din dreapta
}
int32_t main()
{
int m;
in >> n >> m;
for(int i = 1; i <= n; i++)
{
int x;
in >> x;
sp[i] = sp[i - 1] + x;
}
for(int i = 1; i <= n; i++)
dist[i] = dist[i - 1] + sp[i - 1];
for(int i = n; i >= 1; i--)
distdr[i] = distdr[i + 1] + (sp[n] - sp[i]);
for(int i = 1; i <= m; i++)
solve();
return 0;
}