Pagini recente » Cod sursa (job #1215341) | Cod sursa (job #3216271) | Cod sursa (job #2702083) | Cod sursa (job #208757) | Cod sursa (job #2690353)
#include <fstream>
#define int long long
using namespace std;
ifstream cin("euro.in");
ofstream cout("euro.out");
struct line {
int m, b;
int apply(int x) {
return m*x+b;
}
};
static inline line makeline(int slope, int collateral) {
line rez;
rez.m=slope;
rez.b=collateral;
return rez;
}
class lichao {
public:
line tree[131072];
void insert(int node, int cl, int cr, line val) {
int mid=(cl+cr)/2;
bool leftlow=(val.apply(cl)>tree[node].apply(cl));
bool midlow=(val.apply(mid)>tree[node].apply(mid));
if(midlow) {
swap(tree[node],val);
leftlow=!leftlow;
}
if(cl<cr) {
if(leftlow) {
insert(2*node,cl,mid,val);
}
else {
insert(2*node+1,mid+1,cr,val);
}
}
return;
}
int query(int node, int cl, int cr, int val) {
int recval,mid=(cl+cr)/2;
if(cl==cr)
return tree[node].apply(val);
if(val<=mid) {
recval=query(2*node,cl,mid,val);
}
else
recval=query(2*node+1,mid+1,cr,val);
return max(recval,tree[node].apply(val));
}
}tree;
signed main() {
int n,k,sum=0,x,rez=0;
cin >> n >> k;
for(int i=1; i<=n; i++) {
cin >> x;
sum+=x;
rez=sum*i-k+tree.query(1,1,n,i);
tree.insert(1,1,n,makeline(-sum,rez));
}
cout << rez << '\n';
}