Pagini recente » Cod sursa (job #1425377) | Cod sursa (job #230471) | Cod sursa (job #31203) | Cod sursa (job #1752403) | Cod sursa (job #2475573)
#include <fstream>
using namespace std;
int const NM = 250001;
int pos;
typedef long long ll;
ll v [NM] , s [NM] , sl [NM] , sr [NM] , s2 [NM];
ifstream cin ("cuburi2.in");
ofstream cout ("cuburi2.out");
int a , b;
ll cost (int i){
return 1LL * (sl [i] + sr [i] - (sl [a] + sr [b] + 1LL * (i - a) * s [a - 1] + 1LL * (b - i) * s2 [b + 1]));
}
int main()
{
int n , m;
cin >> n >> m;
for(int i = 1; i <= n ; ++ i){
cin >> v [i];
s [i] = 1LL * (s [i - 1] + v [i]);
}
for(int i = n ; i ; -- i)
s2 [i] = s2 [i + 1] + 1LL * v [i];
for(int i = 1 ; i <= n ; ++ i)
sl [i] = s [i - 1] + sl [i - 1];
for(int i = n ; i ; -- i)
sr [i] = sr [i + 1] + s2 [i + 1];
for(int i = 1 ; i <= n ; ++ i){
ll sum = sl [i] + sr [i];
if (sum <= sl [i + 1] + sr [i + 1] && sum <= sl [i - 1] + sr [i - 1])
pos = i;
}
for(int i = 1 ; i <= m ; ++ i){
cin >> a >> b;
int st = a , to = b;
while (st <= to){
int mid = (st + to) / 2;
ll cs = cost (mid);
if (cs <= cost (mid + 1) && cs <= cost (mid - 1)){
if (cost (b) <= cs)
cout << b << ' ' << cost (b) << '\n';
else
if (cost (a) <= cs)
cout << a << ' ' << cost (a) << '\n';
else
cout << mid << ' ' << cs << '\n';
break;
}
else{
if (cs > cost (mid + 1))
st = mid + 1;
if (cs < cost (mid + 1))
to = mid - 1;
if (cs == cost (mid + 1)){
if (cs < cost (mid - 1))
st = mid + 1;
if (cs > cost (mid - 1))
to = mid - 1;
}
}
}
}
return 0;
}