Pagini recente » Cod sursa (job #908346) | Cod sursa (job #2069986) | Cod sursa (job #370036) | Cod sursa (job #400623) | Cod sursa (job #2475251)
#include <fstream>
using namespace std;
int const NM = 250001;
int v [NM] , s [NM] , sl [NM] , sr [NM] , s2 [NM];
int pos;
ifstream cin ("cuburi2.in");
ofstream cout ("cuburi2.out");
/*int solve (int from , int to){
int l = to - from;
int scad = sl [from] + sr [to];
int c1 = sl [from] + sr [from];
if (ord == 1){
int x = s [from - 1] , y = s [to + 1];
if (to <= pos){
if (x < y)
return (c1 - scad - l * y);
else{
}
}
}
}*/
int c [NM] , a , b;
int cost (int i){
return sl [i] + sr [i] - (sl [a] + sr [b] + (i - a) * s [a - 1] + (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] = s [i - 1] + v [i];
}
for(int i = n ; i ; -- i)
s2 [i] = s2 [i + 1] + 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){
int sum = sl [i] + sr [i];
if (sum <= sl [i + 1] + sr [i + 1] && sum <= sl [i - 1] + sr [i - 1])
pos = i;
// cout << sl [i] + sr [i] << ' ';
}
// cout << '\n';
/* if (sl [1] + sr [1] < sl [2] + sr [2])
ord = 1;
else
ord = 2;*/
for(int i = 1 ; i <= m ; ++ i){
cin >> a >> b;
/* cout << "[" << a << " , " << b << "] :\n";
cout << "ci : ";
for(int i = a ; i <= b ; ++ i)
cout << sl [i] + sr [i] << " , ";
cout << '\n' << "sc : ";
for(int i = a ; i <= b ; ++ i){
cout << sl [a] + sr [b] + (i - a) * s [a - 1] + (b - i) * s2 [b + 1] << " , ";
}
cout << "\nc : ";*/
/* for(int i = a ; i <= b ; ++ i){
c [i] = sl [i] + sr [i] - (sl [a] + sr [b] + (i - a) * s [a - 1] + (b - i) * s2 [b + 1]);
}
int pp = 0;
for(int i = a ; i <= b ; ++ i){
cout << c [i] << " , ";
}
cout << '\n';
// cout << '\n';*/
int st = a , to = b;
while (st <= to){
int mid = (st + to) / 2;
int cs = cost (mid);
if (cs <= cost (mid + 1) && cs <= cost (mid - 1)){
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;
}
}
/* int ans = (1 << 30);
for(int i = a ; i <= b ; ++ i)
ans = min (ans , cost (i));
int ppp = 0;
for(int i = a ; i <= b ; ++ i)
if (ans == cost (i))
ppp = i;
cout << "Ans : " << ppp << ' ' << ans << '\n';
if (ans != oc){
cout << "Wrong";
return 0;
}*/
// f >> a >> b;
// solve (a , b);
}
return 0;
}