Cod sursa(job #2475577)

Utilizator DordeDorde Matei Dorde Data 17 octombrie 2019 10:22:10
Problema Cuburi2 Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.97 kb
#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) , c2 = cost (mid + 1);
            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 > c2)
                    st = mid + 1;
                if (cs < c2)
                    to = mid - 1;
                if (cs == c2){
                    if (cs < cost (mid - 1))
                        st = mid + 1;
                    else
                        to = mid - 1;
                }
           // }
        }
        cout << pos << ' ' << ans << '\n';
    }
    return 0;
}