#include <bits/stdc++.h>
using namespace std;
#define fru(j,n) for(int j=0; j<(n); ++j)
#define tr(it,v) for(typeof((v).begin()) it=(v).begin(); it!=(v).end(); ++it)
#define x first
#define y second
#define pb push_back
#define mp make_pair
#define ALL(G) (G).begin(),(G).end()
typedef long long ll;
typedef double D;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
const int inft = 1000000009;
const int MAXN = 1000006,T=512*1024;
int A[MAXN];
ll suf[MAXN];
pll drzh[2*T],drzsum[2*T];
int n,m;
void updateh(int nr,int L,int R,int a,int b,pll value){
if(b<=L || a>=R)return;
if(a<=L && b>=R){drzh[nr]=value;return;}
updateh(2*nr,L,(L+R)/2,a,b,value);
updateh(2*nr+1,(L+R)/2,R,a,b,value);
}
ll getsum(int nr,int L,int R,int a,int b,ll day,pll best){
if(b<=L || a>=R)return 0;
else if(a<=L && b>=R){
pll w=drzsum[nr];
if(best.x>w.x)w=pll(best.x,1LL*(R-L)*best.y);
return w.y+(day-w.x)*(suf[L]-suf[R]);
}
return getsum(2*nr,L,(L+R)/2,a,b,day,max(best,drzh[nr]))+
getsum(2*nr+1,(L+R)/2,R,a,b,day,max(best,drzh[nr]));
// printf("%d %lld %lld\n",nr,drzsum[nr].x,drzsum[nr].y);
// printf("getsum nr %d, L %d, R %d, a%d, b %d, day %lld -> ret %lld\n",nr,L,R,a,b,day,ret);
}
ll updatesum(int nr,int L,int R,int a,int b,ll h,ll day, pll best){
ll ret=0;
if(b<=L || a>=R){
pll w=drzsum[nr];
if(best.x>w.x)w=pll(best.x,1LL*(R-L)*best.y);
// printf("upd %d %d odcz %lld %lld\n",L,R,w.x,w.y);
return w.y+(day-w.x)*(suf[L]-suf[R]);
}
if(a<=L && b>=R){drzsum[nr]=pll(day,h*(R-L));if(0)printf("%d %d %lld %lld\n",L,R,day,h*(R-L));return drzsum[nr].y;}
ret+=updatesum(2*nr,L,(L+R)/2,a,b,h,day,max(best,drzh[nr]));
ret+=updatesum(2*nr+1,(L+R)/2,R,a,b,h,day,max(best,drzh[nr]));
drzsum[nr]=pll(day,ret);
// printf("updatesum nr %d, L %d, R %d, a%d, b %d, h %lldday %lld -> ret %lld\n",nr,L,R,a,b,h,day,ret);
return ret;
}
void solve() {
scanf("%d%d",&n,&m);
fru(i,n)scanf("%d",A+i);
sort(A,A+n);
suf[n]=0;
for(int i=n-1;i>=0;i--)suf[i]=A[i]+suf[i+1];
fru(i,2*T)drzh[i]=pll(0,0);
fru(i,2*T)drzsum[i]=pll(0,0);
ll day,h;
int it_bound=0;
vector<pair<int,pll> > bound(m+5);
bound[it_bound++]=make_pair(0,pll(0,0));
fru(i,m){
scanf("%lld%lld",&day,&h);
int pocz=0,kon=it_bound,nr,nr_seg;
if(bound[0].y.x+(day-bound[0].y.y)*A[bound[0].x]>h)nr=0;
else{
while(pocz<kon-1){
int med=(pocz+kon)/2;
if(bound[med].y.x+(day-bound[med].y.y)*A[bound[med].x]>h)
kon=med;
else pocz=med;
}
nr_seg=pocz;//mozliwe, ze poczatek nr_seg+1;
pocz=bound[nr_seg].x;
kon=n;
if(nr_seg+1<it_bound)kon=bound[nr_seg+1].x;
pll w=bound[nr_seg].y;
while(pocz<kon-1){
int med=(pocz+kon)/2;
if(w.x+(day-w.y)*A[med]>h)
kon=med;
else pocz=med;
}
nr=kon;
}
if(nr==n){puts("0");continue;}
//dorzuc do bound
while(it_bound>0 && bound[it_bound-1].x>=nr){it_bound--;}
bound[it_bound++]=make_pair(nr,pll(h,day));
// printf("bounds -> %d, %lld %lld\n",nr,h,day);
// printf("nr %d\n",nr);
ll ans=getsum(1,0,n,nr,n,day,pll(0,0))-h*(n-nr);
printf("%lld\n",ans);
updatesum(1,0,n,nr,n,h,day,pll(0,0));
updateh(1,0,n,nr,n,pll(day,h));
}
}
int main() {
// freopen("input.in", "r", stdin);
// freopen("output.out", "w", stdout);
int t=1;
// scanf("%d",&t);
fru(i,t) solve();
return 0;
}
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 110 111 112 113 114 115 116 117 | #include <bits/stdc++.h> using namespace std; #define fru(j,n) for(int j=0; j<(n); ++j) #define tr(it,v) for(typeof((v).begin()) it=(v).begin(); it!=(v).end(); ++it) #define x first #define y second #define pb push_back #define mp make_pair #define ALL(G) (G).begin(),(G).end() typedef long long ll; typedef double D; typedef pair<int,int> pii; typedef pair<ll,ll> pll; typedef vector<int> vi; const int inft = 1000000009; const int MAXN = 1000006,T=512*1024; int A[MAXN]; ll suf[MAXN]; pll drzh[2*T],drzsum[2*T]; int n,m; void updateh(int nr,int L,int R,int a,int b,pll value){ if(b<=L || a>=R)return; if(a<=L && b>=R){drzh[nr]=value;return;} updateh(2*nr,L,(L+R)/2,a,b,value); updateh(2*nr+1,(L+R)/2,R,a,b,value); } ll getsum(int nr,int L,int R,int a,int b,ll day,pll best){ if(b<=L || a>=R)return 0; else if(a<=L && b>=R){ pll w=drzsum[nr]; if(best.x>w.x)w=pll(best.x,1LL*(R-L)*best.y); return w.y+(day-w.x)*(suf[L]-suf[R]); } return getsum(2*nr,L,(L+R)/2,a,b,day,max(best,drzh[nr]))+ getsum(2*nr+1,(L+R)/2,R,a,b,day,max(best,drzh[nr])); // printf("%d %lld %lld\n",nr,drzsum[nr].x,drzsum[nr].y); // printf("getsum nr %d, L %d, R %d, a%d, b %d, day %lld -> ret %lld\n",nr,L,R,a,b,day,ret); } ll updatesum(int nr,int L,int R,int a,int b,ll h,ll day, pll best){ ll ret=0; if(b<=L || a>=R){ pll w=drzsum[nr]; if(best.x>w.x)w=pll(best.x,1LL*(R-L)*best.y); // printf("upd %d %d odcz %lld %lld\n",L,R,w.x,w.y); return w.y+(day-w.x)*(suf[L]-suf[R]); } if(a<=L && b>=R){drzsum[nr]=pll(day,h*(R-L));if(0)printf("%d %d %lld %lld\n",L,R,day,h*(R-L));return drzsum[nr].y;} ret+=updatesum(2*nr,L,(L+R)/2,a,b,h,day,max(best,drzh[nr])); ret+=updatesum(2*nr+1,(L+R)/2,R,a,b,h,day,max(best,drzh[nr])); drzsum[nr]=pll(day,ret); // printf("updatesum nr %d, L %d, R %d, a%d, b %d, h %lldday %lld -> ret %lld\n",nr,L,R,a,b,h,day,ret); return ret; } void solve() { scanf("%d%d",&n,&m); fru(i,n)scanf("%d",A+i); sort(A,A+n); suf[n]=0; for(int i=n-1;i>=0;i--)suf[i]=A[i]+suf[i+1]; fru(i,2*T)drzh[i]=pll(0,0); fru(i,2*T)drzsum[i]=pll(0,0); ll day,h; int it_bound=0; vector<pair<int,pll> > bound(m+5); bound[it_bound++]=make_pair(0,pll(0,0)); fru(i,m){ scanf("%lld%lld",&day,&h); int pocz=0,kon=it_bound,nr,nr_seg; if(bound[0].y.x+(day-bound[0].y.y)*A[bound[0].x]>h)nr=0; else{ while(pocz<kon-1){ int med=(pocz+kon)/2; if(bound[med].y.x+(day-bound[med].y.y)*A[bound[med].x]>h) kon=med; else pocz=med; } nr_seg=pocz;//mozliwe, ze poczatek nr_seg+1; pocz=bound[nr_seg].x; kon=n; if(nr_seg+1<it_bound)kon=bound[nr_seg+1].x; pll w=bound[nr_seg].y; while(pocz<kon-1){ int med=(pocz+kon)/2; if(w.x+(day-w.y)*A[med]>h) kon=med; else pocz=med; } nr=kon; } if(nr==n){puts("0");continue;} //dorzuc do bound while(it_bound>0 && bound[it_bound-1].x>=nr){it_bound--;} bound[it_bound++]=make_pair(nr,pll(h,day)); // printf("bounds -> %d, %lld %lld\n",nr,h,day); // printf("nr %d\n",nr); ll ans=getsum(1,0,n,nr,n,day,pll(0,0))-h*(n-nr); printf("%lld\n",ans); updatesum(1,0,n,nr,n,h,day,pll(0,0)); updateh(1,0,n,nr,n,pll(day,h)); } } int main() { // freopen("input.in", "r", stdin); // freopen("output.out", "w", stdout); int t=1; // scanf("%d",&t); fru(i,t) solve(); return 0; } |
English