Pagini recente » Cod sursa (job #2665638) | Cod sursa (job #1903285) | Cod sursa (job #2922450) | Cod sursa (job #1401562) | Cod sursa (job #2475071)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin ("cuburi2.in");
ofstream fout ("cuburi2.out");
int n, m, h[250001];
unsigned long long sp_st[250001], sp_dr[250001], cost_st[250001], cost_dr[250001];
int main()
{
int x, y, i, j, l, st, dr, mijl, poz;
unsigned long long minim, cost, de_mutat_st, de_mutat_dr;
fin >> n >> m;
for (i = 1; i<= n; i++)
{
fin >> h[i];
sp_st[i] = sp_st[i-1] + h[i];
cost_st[i] = cost_st[i-1] + sp_st[i];
}
for (i = n; i>= 1; i--)
{
sp_dr[i] = sp_dr[i+1] + h[i];
cost_dr[i] = cost_dr[i+1] + sp_dr[i];
}
for (l = 1; l<= m; l++)
{
fin >> x >> y;
st = x;
dr = y;
minim = cost_st[x-1] + cost_dr[x+1];
poz = x;
while (st <= dr)
{
mijl = (st + dr)/2;
cost = cost_st[mijl-1] - cost_st[x-1] - sp_st[x-1]*(mijl-x) + cost_dr[mijl+1] - cost_dr[y+1] - sp_dr[y+1]*(y-mijl);
if(sp_st[mijl-1] - sp_st[x-1] < sp_dr[mijl+1] - sp_dr[y+1])
{//ne ducem in dreapta
poz = mijl;
minim = cost;
st = mijl + 1;
}
else
{
dr = mijl-1;
}
}
if(minim > cost)
fout << mijl << " " << cost << '\n';
else
fout << poz << " " << minim << '\n';
}
return 0;
}