Pagini recente » Monitorul de evaluare | Cod sursa (job #1053622) | Cod sursa (job #597320) | Cod sursa (job #1261108) | Cod sursa (job #1385889)
#include <fstream>
#define DIM 8192
#define Max_Size 250010
using namespace std;
ifstream fin ("cuburi2.in");
ofstream fout ("cuburi2.out");
int N, M;
long long V[Max_Size], ST[Max_Size], DR[Max_Size];
char P[DIM+16], *now;
inline void Verify()
{
if (*now == '\0')
{
fin.get(P, DIM, '\0');
now = P;
}
}
inline int Get_Num()
{
while (*now < '0' || *now > '9')
{
now++;
Verify();
}
int number = 0;
while (*now >= '0' && *now <= '9')
{
number = number * 10 + *now - '0';
now++;
Verify();
}
return number;
}
inline long long Calc_Val(int st, int dr, int midle)
{
long long v_left = ST[midle - 1] - ST[st - 1] - (V[st - 1] * (midle - st));
long long v_right = DR[midle + 1] - DR[dr + 1] - ((V[N] - V[dr]) * (dr - midle));
return v_left + v_right;
}
int main()
{
now = P;
Verify();
N = Get_Num();
M = Get_Num();
for (int i = 1; i <= N; i++)
{
V[i] = Get_Num();
V[i] = V[i] + V[i-1];
}
for (int i = 1; i <= N; i++) {
ST[i] = ST[i-1] + V[i];
}
for (int i = N; i >= 1; i--) {
DR[i] = DR[i+1] + V[N] - V[i-1];
}
for (int i = 1; i <= M; i++)
{
int x, y, p, u, mij, sol;
x = Get_Num();
y = Get_Num();
p = x;
u = y;
while (p <= u)
{
mij = (p + u) / 2;
if (Calc_Val(x, y, mij) <= Calc_Val(x, y, mij + 1))
{
sol = mij;
u = mij - 1;
}
else
{
p = mij + 1;
}
}
fout << sol << ' ' << Calc_Val(x, y, sol) << '\n';
}
fout.close();
return 0;
}