#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<cassert>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<bitset>
#include<set>
#include<map>
#define REP(i,n) for(int i=0;i<(n);i++)
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define FORD(i,a,b) for(int i=(a);i>=(b);i--)
#define foreach(i,c) for(__typeof((c).begin())i=(c).begin();i!=(c).end();i++)
#define all(c) (c).begin(),(c).end()
#define scanf(...) scanf(__VA_ARGS__)?:0
#define eprintf(...) fprintf(stderr,__VA_ARGS__),fflush(stderr)
#define e1 first
#define e2 second
#define mp make_pair
#define pb push_back
#define eb emplace_back
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<ll,int> pli;
typedef pair<int,ll> pil;
inline int ceil2(int a){return 1<<((sizeof(int)<<3)-__builtin_clz(a));}
int n,m,s,temp,x[500001],lk[500001];
ll ss[500002],w[500001];
pll z[500001];
pii tree[1048576];
stack<int,vector<int> >stos;
void zmien(int a,int b,int s,int nr=1,int z1=1,int z2=ceil2(n-1))
{
if (a==z1 && b==z2)
{
tree[nr].e1=tree[nr].e2=s;
return;
}
int sr=(z1+z2)>>1;
if (a<=sr) zmien(a,min(b,sr),s,nr<<1,z1,sr);
if (b>sr) zmien(max(a,sr+1),b,s,(nr<<1)+1,sr+1,z2);
tree[nr].e2=max(tree[nr].e1,tree[(nr<<1)+1].e2);
}
int znajdz(int a,int b,int zm=0,int nr=1,int z1=1,int z2=ceil2(n-1))
{
if (z1==z2)
{
int ost=max(zm,tree[nr].e1);
if (z[ost].e2+(z[temp].e1-z[ost].e1)*x[a]<=z[temp].e2) return -1;
return a;
}
zm=max(zm,tree[nr].e1);
int sr=(z1+z2)>>1;
if (b<=sr) return znajdz(a,b,zm,nr<<1,z1,sr);
if (a>sr) return znajdz(a,b,zm,(nr<<1)+1,sr+1,z2);
int ost=max(zm,tree[nr<<1].e2);
if (z[ost].e2+(z[temp].e1-z[ost].e1)*x[sr]<=z[temp].e2) return znajdz(sr+1,b,zm,(nr<<1)+1,sr+1,z2);
else return znajdz(a,sr,zm,nr<<1,z1,sr);
}
int main()
{
scanf("%d%d",&n,&m);
FOR(i,1,n) scanf("%d",&x[i]);
sort(x+1,x+n+1);
FORD(i,n,1) ss[i]=ss[i+1]+x[i];
FOR(i,1,m)
{
scanf("%lld%lld",&z[i].e1,&z[i].e2); temp=i;
lk[i]=znajdz(1,n);
if (lk[i]==-1){ puts("0"); continue; }
zmien(lk[i],n,temp);
while (!stos.empty() && lk[i]<=lk[stos.top()]) w[i]+=w[stos.top()],stos.pop();
ll wyn=stos.empty()?z[i].e1*ss[lk[i]]:((z[i].e1-z[stos.top()].e1)*ss[lk[i]]+z[stos.top()].e2*(n-lk[i]+1));
wyn-=z[i].e2*(n-lk[i]+1);
printf("%lld\n",(ll)(wyn-w[i]));
stos.push(i);
w[i]=wyn;
}
}
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 | #include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<cassert> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<bitset> #include<set> #include<map> #define REP(i,n) for(int i=0;i<(n);i++) #define FOR(i,a,b) for(int i=(a);i<=(b);i++) #define FORD(i,a,b) for(int i=(a);i>=(b);i--) #define foreach(i,c) for(__typeof((c).begin())i=(c).begin();i!=(c).end();i++) #define all(c) (c).begin(),(c).end() #define scanf(...) scanf(__VA_ARGS__)?:0 #define eprintf(...) fprintf(stderr,__VA_ARGS__),fflush(stderr) #define e1 first #define e2 second #define mp make_pair #define pb push_back #define eb emplace_back using namespace std; typedef long long ll; typedef long double ld; typedef unsigned int uint; typedef unsigned long long ull; typedef pair<int,int> pii; typedef pair<ll,ll> pll; typedef pair<ll,int> pli; typedef pair<int,ll> pil; inline int ceil2(int a){return 1<<((sizeof(int)<<3)-__builtin_clz(a));} int n,m,s,temp,x[500001],lk[500001]; ll ss[500002],w[500001]; pll z[500001]; pii tree[1048576]; stack<int,vector<int> >stos; void zmien(int a,int b,int s,int nr=1,int z1=1,int z2=ceil2(n-1)) { if (a==z1 && b==z2) { tree[nr].e1=tree[nr].e2=s; return; } int sr=(z1+z2)>>1; if (a<=sr) zmien(a,min(b,sr),s,nr<<1,z1,sr); if (b>sr) zmien(max(a,sr+1),b,s,(nr<<1)+1,sr+1,z2); tree[nr].e2=max(tree[nr].e1,tree[(nr<<1)+1].e2); } int znajdz(int a,int b,int zm=0,int nr=1,int z1=1,int z2=ceil2(n-1)) { if (z1==z2) { int ost=max(zm,tree[nr].e1); if (z[ost].e2+(z[temp].e1-z[ost].e1)*x[a]<=z[temp].e2) return -1; return a; } zm=max(zm,tree[nr].e1); int sr=(z1+z2)>>1; if (b<=sr) return znajdz(a,b,zm,nr<<1,z1,sr); if (a>sr) return znajdz(a,b,zm,(nr<<1)+1,sr+1,z2); int ost=max(zm,tree[nr<<1].e2); if (z[ost].e2+(z[temp].e1-z[ost].e1)*x[sr]<=z[temp].e2) return znajdz(sr+1,b,zm,(nr<<1)+1,sr+1,z2); else return znajdz(a,sr,zm,nr<<1,z1,sr); } int main() { scanf("%d%d",&n,&m); FOR(i,1,n) scanf("%d",&x[i]); sort(x+1,x+n+1); FORD(i,n,1) ss[i]=ss[i+1]+x[i]; FOR(i,1,m) { scanf("%lld%lld",&z[i].e1,&z[i].e2); temp=i; lk[i]=znajdz(1,n); if (lk[i]==-1){ puts("0"); continue; } zmien(lk[i],n,temp); while (!stos.empty() && lk[i]<=lk[stos.top()]) w[i]+=w[stos.top()],stos.pop(); ll wyn=stos.empty()?z[i].e1*ss[lk[i]]:((z[i].e1-z[stos.top()].e1)*ss[lk[i]]+z[stos.top()].e2*(n-lk[i]+1)); wyn-=z[i].e2*(n-lk[i]+1); printf("%lld\n",(ll)(wyn-w[i])); stos.push(i); w[i]=wyn; } } |
English