Pagini recente » Cod sursa (job #2767518) | Cod sursa (job #2576121) | Cod sursa (job #2818572) | Cod sursa (job #1361861) | Cod sursa (job #2475574)
#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;
if (cost (b) <= cost (b - 1)){
cout << b << ' ' << cost (b) << '\n';
continue;
}
int st = a , to = b;
ll ans = (1LL << 60);
pos = -1;
while (st <= to){
int mid = (st + to) / 2;
ll cs = cost (mid);
if (cs < ans)
ans = cs , pos = mid;
/* if (cs <= cost (mid + 1) && cs <= cost (mid - 1) && mid != 1 && mid != n){
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;
}
// }
}
cout << pos << ' ' << ans << '\n';
}
return 0;
}