Cod sursa(job #2475568)

Utilizator DordeDorde Matei Dorde Data 17 octombrie 2019 10:03:12
Problema Cuburi2 Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.84 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;
        while (st <= to){
            int mid = (st + to) / 2;
            ll cs = cost (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;
                }
            }
        }
    }
    return 0;
}