#include<cstdio> #include<algorithm> #define N 1050000 typedef long long ll; int n,m,i,a[N/2];ll now,old,R,ans; inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';} inline void read(ll&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10LL)+=c-'0';} struct P{ bool a;ll b,c; P(){a=1,b=c=0;} P(bool _a,ll _b,ll _c){a=_a,b=_b,c=_c;} P operator+(P B){return P(a&B.a,b*B.a+B.b,c*B.a+B.c);} }tag[N]; struct Node{ll vl,vr,vs,s;}T[N]; inline void add(int x,P p,int a,int b){ if(p.a){ T[x].vl+=p.b+p.c*::a[a]; T[x].vr+=p.b+p.c*::a[b]; T[x].vs+=p.b*(b-a+1)+p.c*T[x].s; }else{ T[x].vl=p.b+p.c*::a[a]; T[x].vr=p.b+p.c*::a[b]; T[x].vs=p.b*(b-a+1)+p.c*T[x].s; } tag[x]=tag[x]+p; } inline void pb(int x,int a,int b){ int mid=(a+b)>>1; add(x<<1,tag[x],a,mid),add(x<<1|1,tag[x],mid+1,b); tag[x]=P(); } void build(int x,int a,int b){ if(a==b){T[x].s=::a[a];return;} int mid=(a+b)>>1; build(x<<1,a,mid),build(x<<1|1,mid+1,b); T[x].s=T[x<<1].s+T[x<<1|1].s; } void check(int x,int a,int b){ if(T[x].vr<=R)return; if(T[x].vl>R){ ans+=T[x].vs-R*(b-a+1); add(x,P(0,R,0),a,b); return; } pb(x,a,b); int mid=(a+b)>>1; check(x<<1,a,mid),check(x<<1|1,mid+1,b); T[x].vl=T[x<<1].vl,T[x].vr=T[x<<1|1].vr; T[x].vs=T[x<<1].vs+T[x<<1|1].vs; } int main(){ for(read(n),read(m),i=1;i<=n;i++)read(a[i]); std::sort(a+1,a+n+1); build(1,1,n); while(m--){ read(now),read(R); add(1,P(1,0,now-old),1,n); ans=0; check(1,1,n); old=now; printf("%lld\n",ans); } 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 | #include<cstdio> #include<algorithm> #define N 1050000 typedef long long ll; int n,m,i,a[N/2];ll now,old,R,ans; inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';} inline void read(ll&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10LL)+=c-'0';} struct P{ bool a;ll b,c; P(){a=1,b=c=0;} P(bool _a,ll _b,ll _c){a=_a,b=_b,c=_c;} P operator+(P B){return P(a&B.a,b*B.a+B.b,c*B.a+B.c);} }tag[N]; struct Node{ll vl,vr,vs,s;}T[N]; inline void add(int x,P p,int a,int b){ if(p.a){ T[x].vl+=p.b+p.c*::a[a]; T[x].vr+=p.b+p.c*::a[b]; T[x].vs+=p.b*(b-a+1)+p.c*T[x].s; }else{ T[x].vl=p.b+p.c*::a[a]; T[x].vr=p.b+p.c*::a[b]; T[x].vs=p.b*(b-a+1)+p.c*T[x].s; } tag[x]=tag[x]+p; } inline void pb(int x,int a,int b){ int mid=(a+b)>>1; add(x<<1,tag[x],a,mid),add(x<<1|1,tag[x],mid+1,b); tag[x]=P(); } void build(int x,int a,int b){ if(a==b){T[x].s=::a[a];return;} int mid=(a+b)>>1; build(x<<1,a,mid),build(x<<1|1,mid+1,b); T[x].s=T[x<<1].s+T[x<<1|1].s; } void check(int x,int a,int b){ if(T[x].vr<=R)return; if(T[x].vl>R){ ans+=T[x].vs-R*(b-a+1); add(x,P(0,R,0),a,b); return; } pb(x,a,b); int mid=(a+b)>>1; check(x<<1,a,mid),check(x<<1|1,mid+1,b); T[x].vl=T[x<<1].vl,T[x].vr=T[x<<1|1].vr; T[x].vs=T[x<<1].vs+T[x<<1|1].vs; } int main(){ for(read(n),read(m),i=1;i<=n;i++)read(a[i]); std::sort(a+1,a+n+1); build(1,1,n); while(m--){ read(now),read(R); add(1,P(1,0,now-old),1,n); ans=0; check(1,1,n); old=now; printf("%lld\n",ans); } return 0; } |