#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <stack>
using namespace std;
int n, m;
long long *a, *d, *b;
long long start, stop;
long long *sums;
stack<long long> D, B;
stack<int> S, E;
void init();
long long calc( long long d, long long b, int s, int e);
long long height(long long d, long long b, int e);
int main()
{
ios_base::sync_with_stdio(false);
init();
for( int i=0 ; i<m ; i++ ) {
long long difference = 0;
while( !D.empty() && height( D.top(), B.top(), E.top() ) > height( d[i], b[i], E.top() ) ) {
long long l=-1, r=E.top(), mid;
while( l+1<r ) {
mid = (l+r+1)/2;
if( height( D.top(), B.top(), mid ) > height( d[i], b[i], mid ) )
r = mid;
else
l = mid;
}
if( S.top() >= r ) {
difference += calc( D.top(), B.top(), S.top(), E.top() );
D.pop();
B.pop();
S.pop();
E.pop();
}
else {
difference += calc( D.top(), B.top(), r, E.top() );
E.top() = r-1;
}
}
if( D.empty() ) {
D.push(d[i]);
B.push(b[i]);
S.push(0);
E.push(n-1);
difference -= calc( D.top(), B.top(), S.top(), E.top() );
} else if( E.top() != n-1 ) {
D.push(d[i]);
B.push(b[i]);
S.push( E.top()+1 );
E.push(n-1);
difference -= calc( D.top(), B.top(), S.top(), E.top() );
}
cout << difference << "\n";
}
return 0;
}
void init() {
cin >> n >> m;
a = new long long [n];
for( int i=0 ; i<n ; i++ )
cin >> a[i];
sort( a, a+n );
d = new long long [m];
b = new long long [m];
for( int i=0 ; i<m ; i++ )
cin >> d[i] >> b[i];
start = 0;
stop = d[m-1];
sums = new long long [n+1];
sums[0] = 0;
for( int i=1 ; i<=n ; i++ )
sums[i] = sums[i-1] + a[i-1];
D.push(0);
B.push(0);
S.push(0);
E.push(n-1);
}
long long calc( long long d, long long b, int s, int e) {
long long rage = sums[e+1]-sums[s];
long long field=0;
field += b * (e-s+1);
field += rage * (stop - d);
return field;
}
long long height(long long d, long long b, int e) {
long long w = b;
w += (stop-d)*a[e];
return w;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | #include <cstdio> #include <iostream> #include <algorithm> #include <string> #include <vector> #include <stack> using namespace std; int n, m; long long *a, *d, *b; long long start, stop; long long *sums; stack<long long> D, B; stack<int> S, E; void init(); long long calc( long long d, long long b, int s, int e); long long height(long long d, long long b, int e); int main() { ios_base::sync_with_stdio(false); init(); for( int i=0 ; i<m ; i++ ) { long long difference = 0; while( !D.empty() && height( D.top(), B.top(), E.top() ) > height( d[i], b[i], E.top() ) ) { long long l=-1, r=E.top(), mid; while( l+1<r ) { mid = (l+r+1)/2; if( height( D.top(), B.top(), mid ) > height( d[i], b[i], mid ) ) r = mid; else l = mid; } if( S.top() >= r ) { difference += calc( D.top(), B.top(), S.top(), E.top() ); D.pop(); B.pop(); S.pop(); E.pop(); } else { difference += calc( D.top(), B.top(), r, E.top() ); E.top() = r-1; } } if( D.empty() ) { D.push(d[i]); B.push(b[i]); S.push(0); E.push(n-1); difference -= calc( D.top(), B.top(), S.top(), E.top() ); } else if( E.top() != n-1 ) { D.push(d[i]); B.push(b[i]); S.push( E.top()+1 ); E.push(n-1); difference -= calc( D.top(), B.top(), S.top(), E.top() ); } cout << difference << "\n"; } return 0; } void init() { cin >> n >> m; a = new long long [n]; for( int i=0 ; i<n ; i++ ) cin >> a[i]; sort( a, a+n ); d = new long long [m]; b = new long long [m]; for( int i=0 ; i<m ; i++ ) cin >> d[i] >> b[i]; start = 0; stop = d[m-1]; sums = new long long [n+1]; sums[0] = 0; for( int i=1 ; i<=n ; i++ ) sums[i] = sums[i-1] + a[i-1]; D.push(0); B.push(0); S.push(0); E.push(n-1); } long long calc( long long d, long long b, int s, int e) { long long rage = sums[e+1]-sums[s]; long long field=0; field += b * (e-s+1); field += rage * (stop - d); return field; } long long height(long long d, long long b, int e) { long long w = b; w += (stop-d)*a[e]; return w; } |
English