Pagini recente » Cod sursa (job #1732654) | Cod sursa (job #2182278) | Cod sursa (job #3184085) | Cod sursa (job #2668926) | Cod sursa (job #265973)
Cod sursa(job #265973)
#include <fstream>
using namespace std;
ifstream fin("cuburi2.in");
ofstream fout("cuburi2.out");
#define NMAX 260000
#define ll long long
struct dir { ll l,r; };
ll A[NMAX], N, M, x, y;
dir Sum[NMAX], Cost[NMAX];
inline int CautBin(int st, int end)
{
ll m, ok, msum;
msum = (Sum[y].l - Sum[x-1].l) / 2 + Sum[x - 1].l;
m = (st + end) / 2;
while (st <= end)
{
m = (st + end) / 2;
if (Sum[m - 1].l < msum && Sum[m].l >= msum)
end = st - 1;
else
{
if (Sum[m].l < msum) st = m + 1;
if (Sum[m].l >= msum) end = m - 1;
}
}
return m;
}
int main()
{
ll i, j, i2, sol, cost;
fin >>N >>M;
for (i = 1; i <= N; i++)
fin >>A[i];
for (i = 1, j = N; i <= N; i++, j--) //Calcularea Costurilor / Precalcularea sumelor
{
Sum[i].l = Sum[i-1].l + A[i];
Sum[j].r = Sum[j+1].r + A[j];
Cost[i].l = Cost[i-1].l + Sum[i-1].l;
Cost[j].r = Cost[j+1].r + Sum[j+1].r;
}
for (i2 = 1; i2 <= M; i2++)
{
fin >>x >>y;
sol = CautBin(x, y);
cost = (Cost[sol].l - Cost[x].l - (sol-x)*A[x-1]) + (Cost[sol].r - Cost[y].r - (y-sol)*A[y+1]);
fout <<sol <<' ' <<cost <<'\n';
}
fout.close();
return 0;
}