Cod sursa(job #2475251)

Utilizator DordeDorde Matei Dorde Data 16 octombrie 2019 16:58:58
Problema Cuburi2 Scor 22
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.23 kb
#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;
}