Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <bitset>
- #include <deque>
- #include <cmath>
- #include <cstdio>
- #include <cstdlib>
- #include <cstring>
- #include <iostream>
- #include <list>
- #include <map>
- #include <queue>
- #include <set>
- #include <sstream>
- #include <stack>
- #include <string>
- #include <utility>
- #include <vector>
- #define fst first
- #define snd second
- #define all(x) (x).begin(), (x).end()
- #define clr( a , v ) memset( a , v , sizeof(a) )
- #define pb push_back
- #define mp make_pair
- #define sz size()
- #define FORN( i , s , n ) for( int64 i = s ; i < (int64)(n) ; i++ )
- #define FOR( i , n ) FORN( i , 0 , n )
- #define FORIT(i,x) for( typeof x.begin() i = x.begin() ; i != x.end() ; i++ )
- #define trace(x) cout << #x << ": " << x << endl;
- #define trace2(x, y) cout << #x << ": " << x << " | " << #y << ": " << y << endl;
- #define read ios::sync_with_stdio(false)
- using namespace std;
- typedef long long int64;
- const int64 N = 1000001;
- const int64 LN = 30; //log2(N) + 1
- int64 a[N], Log2[N], p[LN][N];
- void pre(){
- int64 k = 0;
- FORN( i , 1 , N+1 ){
- Log2[i] = k;
- if ( 1<<(k+1) == i ) k++;
- }
- }
- void init( int64 n ) {
- int64 ln = Log2[n], i1, i2;
- FOR( i , n ) p[0][i] = i;
- FORN( i , 1 , ln+1 ){
- FORN( j , 0 , n - (1<<i) + 1 ){
- i1 = p[i-1][ j ];
- i2 = p[i-1][ j + (1 << i-1) ];
- p[i][j] = a[i1] <= a[i2] ? i1 : i2;
- }
- }
- }
- int64 query(int64 i, int64 j) {
- if( i > j ) return 0;
- int64 ln = Log2[ j - i + 1 ];
- int64 i1 = p[ ln ][ i ];
- int64 i2 = p[ ln ][ j - (1 << ln) + 1 ];
- return a[i1] <= a[i2] ? i1 : i2;
- }
- int64 le[N], ri[N], acum[N];
- int main(){
- int64 n; cin >> n;
- FOR( i , n ){
- cin >> a[i];
- if( i == 0 ) acum[i] = a[0];
- else acum[i] = acum[i-1] + a[i];
- }
- pre(); init( n+5 );
- FOR( i , n ){
- int64 hi = n-1, lo = i, mid, id;
- while( hi - lo > 1 ){
- mid = ( hi + lo ) / 2;
- id = query( i , mid );
- if( a[id] >= a[i] ) lo = mid;
- else hi = mid;
- }
- id = query( i , hi );
- if( a[id] >= a[i] ) ri[i] = hi;
- else ri[i] = lo;
- hi = i, lo = 0;
- while( hi - lo > 1 ){
- mid = ( hi + lo ) / 2;
- id = query( mid , i );
- if( a[id] >= a[i] ) hi = mid;
- else lo = mid;
- }
- id = query( lo , i );
- if( a[id] >= a[i] ) le[i] = lo;
- else le[i] = hi;
- }
- int64 ans = 0;
- int64 l, r, ansl, ansr, cur;
- FOR( i , n ){
- l = le[i], r = ri[i];
- if( l == 0 ) cur = a[i] * acum[r];
- else cur = a[i] * ( acum[r] - acum[l-1] );
- if( ans <= cur ){
- ans = cur;
- ansl = l, ansr = r;
- }
- }
- cout << ans << endl;
- cout << ansl+1 << " " << ansr+1 << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment