Pagini recente » Cod sursa (job #803397) | Cod sursa (job #2060012) | Cod sursa (job #2069181) | Cod sursa (job #2840947) | Cod sursa (job #1558598)
#include <fstream>
#include <iostream>
using namespace std;
ifstream fin("cuburi2.in");
ofstream fout("cuburi2.out");
const int MAX = 250010;
const long long INF = 9999999999999999;
long long H[MAX];
long long l[MAX], r[MAX];
long long ns[MAX], nd[MAX];
long long N, M;
long long x, y;
long long p;
void BinarySearch( int x, int y );
int main()
{
int i;
fin >> N >> M;
for ( i = 1; i <= N; i++ )
fin >> H[i];
l[1] = 0;
for ( i = 2; i <= N; i++ )
{
p += H[i - 1];
l[i] = l[i - 1] + p;
ns[i] = p;
}
r[N] = 0; p = 0;
for ( i = N - 1; i >= 1; i-- )
{
p += H[i + 1];
r[i] = r[i + 1] + p;
nd[i] = p;
}
/*for ( i = 1; i <= N; i++ )
fout << l[i] << ' ';
fout << '\n';
for ( i = 1; i <= N; i++ )
fout << r[i] << ' ';
fout << '\n'; */
for ( i = 1; i <= M; i++ )
{
fin >> x >> y;
BinarySearch(x, y);
}
fin.close();
fout.close();
return 0;
}
void BinarySearch( int x, int y )
{
long long sl = ns[x], sr = nd[y];
long long i1 = x, i2 = y;
long long st = x, dr = y, mid, poz = x;
long long s1, s2 = INF;
/* for ( poz = x; poz <= y; poz++ )
{
s1 = l[poz] - ( sl * ( poz - i1 ) + l[x] ) + r[poz] - ( sr * ( i2 - poz ) + r[y] );
if ( s1 < s2 )
s2 = s1, mid = poz;
}
fout << mid << ' ' << s2 << '\n'; */
while ( st <= dr )
{
mid = ( st + dr ) / 2;
if ( l[mid] - ( sl * ( mid - i1 ) + l[x] ) < r[mid] - ( sr * ( i2 - mid ) + r[y] ) )
{
st = mid + 1;
poz = mid;
}
else
dr = mid - 1;
}
s1 = l[poz] - ( sl * ( poz - i1 ) + l[x] ) + r[poz] - ( sr * ( i2 - poz ) + r[y] );
if ( poz != y )
s2 = l[poz + 1] - ( sl * ( (poz + 1) - i1 ) + l[x] ) + r[poz + 1] - ( sr * ( i2 - (poz + 1) ) + r[y] );
else
s2 = INF;
if ( s1 < s2 )
{
fout << poz << ' ' << s1 << '\n';
}
else
{
fout << poz + 1 << ' ' << s2 << '\n';
}
}