#include<bits/stdc++.h>
#define rep(i,j,k) for(register int i(j);i<=k;++i)
#define drp(i,j,k) for(register int i(j);i>=k;--i)
#define int long long
using namespace std;
typedef long long lxl;
template<typename T>
inline T max(T &a, T &b) {
return a > b ? a : b;
}
template<typename T>
inline T min(T &a, T &b) {
return a < b ? a : b;
}
inline char gt() {
static char buf[1 << 21], *p1 = buf, *p2 = buf;
return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++;
}
template <typename T>
inline void read(T &x) {
register char ch = gt();
x = 0;
register int w(0);
while(!(ch >= '0' && ch <= '9'))ch = gt();
while(ch >= '0' && ch <= '9')x = (x << 1) + (x << 3) + (ch & 15), ch = gt();
w ? x = ~(x - 1) : x;
}
template <typename T>
inline void out(T x) {
register char ch[20];
register int num(0);
while(x || !num) ch[++num] = x % 10 + '0', x /= 10;
while(num) putchar(ch[num--]);
putchar('\n');
}
const int N = 5e6 + 79;
int n, m;
int a[N];
lxl sum[N];
lxl day, b, h;
struct SegmentTree {
int lc[N << 1], rc[N << 1];
lxl tag[N << 1], ar[N << 1], data[N << 1], add[N << 1];
int cnt, root;
inline void build(int &p, int L, int R) {
if(!p) p = ++cnt;
tag[p] = -1;
if(L == R) return;
int mid(L + R >> 1);
build(lc[p], L, mid);
build(rc[p], mid + 1, R);
}
inline void pushup(int p) {
data[p] = data[lc[p]] + data[rc[p]];
ar[p] = ar[rc[p]];
}
inline void change1(int p, int L, int R, lxl val) {
tag[p] = val;
data[p] = 1ll * (R - L + 1) * val;
ar[p] = val;
add[p] = 0;
}
inline void change2(int p, int L, int R, lxl val) {
add[p] += val;
data[p] += 1ll * (sum[R] - sum[L - 1]) * val;
ar[p] += 1ll*a[R] * val;
}
inline void pushdown(int p, int L, int R) {
int mid(L + R >> 1);
if(tag[p] != -1) {
change1(lc[p], L, mid, tag[p]);
change1(rc[p], mid + 1, R, tag[p]);
tag[p] = -1;
}
if(add[p]) {
change2(lc[p], L, mid, add[p]);
change2(rc[p], mid + 1, R, add[p]);
add[p] = 0;
}
}
inline int find(int p, int L, int R, lxl val) {
if(L == R) {
return data[p] < val ? n + 1 : L;
}
pushdown(p, L, R);
int mid((L + R >> 1));
if(ar[lc[p]] >= val) return find(lc[p], L, mid, val);
else return find(rc[p], mid + 1, R, val);
}
inline lxl change3(int p, int L, int R, int ll, int rr, lxl val) {
if(!p) return 0;
if(ll <= L && rr >= R) {
lxl tmp = data[p];
change1(p, L, R, val);
return tmp - data[p];
}
int mid(L + R >> 1);
lxl ans(0);
pushdown(p, L, R);
if(ll <= mid) ans += change3(lc[p], L, mid, ll, rr, val);
if(rr > mid) ans += change3(rc[p], mid + 1, R, ll, rr, val);
pushup(p);
return ans;
}
} S;
main() {
// freopen("chives.in", "r", stdin);
// freopen("chives.out", "w", stdout);
read(n);
read(m);
rep(i, 1, n) {
read(a[i]);
}
sort(a + 1, a + n + 1);
rep(i, 1, n) {
sum[i] = sum[i - 1] + a[i];
}
S.build(S.root, 1, n);
lxl now = 0;
while(m--) {
read(day);
read(b);
S.change2(S.root, 1, n, day - now);
now = day;
out(S.change3(S.root, 1, n, S.find(S.root, 1, n, b), n, b));
}
return 0;
}