//Daniel Grzegorzewski
#include <bits/stdc++.h>
#define MP make_pair
#define PB push_back
#define ST first
#define ND second
#define int long long
using namespace std;
typedef pair<int, int> PII;
typedef vector<int> VI;
typedef vector<PII> VII;
typedef long long LL;
const int N = 5*(int)1e5 + 10;
const int SQ = 710;
int n, m, kiedy[N], lvl[N], a[N], ki[SQ], lv[SQ], suf[N];
int d, b;
bool git[SQ];
void re(int i)
{
int co = i/SQ;
if (kiedy[i] < ki[co]) {
kiedy[i] = ki[co];
lvl[i] = lv[co];
}
}
int bins(int v)
{
int x1 = 0, x2 = n-1, x3;
while (x2-x1 > 1) {
x3 = (x1+x2)/2;
re(x3);
if (lvl[x3]+(d-kiedy[x3])*a[x3] > v)
x2 = x3;
else
x1 = x3;
}
re(x1);
if (lvl[x1]+(d-kiedy[x1])*a[x1] > v)
return x1;
re(x2);
if (lvl[x2]+(d-kiedy[x2])*a[x2] > v)
return x2;
return -1;
}
#undef int
int main()
{
#define int long long
scanf("%lld%lld", &n, &m);
for (int i = 0; i < n; ++i)
scanf("%lld", &a[i]);
for (int i = 0; i < SQ; ++i)
git[i] = true;
sort(a, a+n);
for (int i = n-1; i >= 0; --i)
suf[i] = suf[i+1] + a[i];
while (m--) {
scanf("%lld%lld", &d, &b);
int kt = bins(b);
if (kt == -1) {
printf("0\n");
continue;
}
int lim, res = 0;
if (kt%SQ == 0)
lim = kt;
else
lim = kt+(SQ-kt%SQ);
lim = min(lim, n);
int wsk = kt/SQ;
if (lim != kt)
git[wsk] = false;
for (int i = kt; i < lim; ++i) {
re(i);
res += lvl[i]+(d-kiedy[i])*a[i]-b;
kiedy[i] = d;
lvl[i] = b;
}
for (int i = lim; i < n; i += SQ) {
int nr = i/SQ;
if (git[nr]) {
int spr = SQ;
if (i+SQ >= n)
spr = n-i;
res += (suf[i]-suf[i+spr])*(d-ki[nr])+spr*(lv[nr]-b);
ki[nr] = d;
lv[nr] = b;
continue;
}
for (int j = i; j < min(n, i+SQ); ++j) {
re(j);
res += lvl[j]+(d-kiedy[j])*a[j]-b;
kiedy[j] = ki[nr];
lvl[j] = lv[nr];
}
git[nr] = true;
ki[nr] = d;
lv[nr] = b;
}
printf("%lld\n", res);
}
}
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 | //Daniel Grzegorzewski #include <bits/stdc++.h> #define MP make_pair #define PB push_back #define ST first #define ND second #define int long long using namespace std; typedef pair<int, int> PII; typedef vector<int> VI; typedef vector<PII> VII; typedef long long LL; const int N = 5*(int)1e5 + 10; const int SQ = 710; int n, m, kiedy[N], lvl[N], a[N], ki[SQ], lv[SQ], suf[N]; int d, b; bool git[SQ]; void re(int i) { int co = i/SQ; if (kiedy[i] < ki[co]) { kiedy[i] = ki[co]; lvl[i] = lv[co]; } } int bins(int v) { int x1 = 0, x2 = n-1, x3; while (x2-x1 > 1) { x3 = (x1+x2)/2; re(x3); if (lvl[x3]+(d-kiedy[x3])*a[x3] > v) x2 = x3; else x1 = x3; } re(x1); if (lvl[x1]+(d-kiedy[x1])*a[x1] > v) return x1; re(x2); if (lvl[x2]+(d-kiedy[x2])*a[x2] > v) return x2; return -1; } #undef int int main() { #define int long long scanf("%lld%lld", &n, &m); for (int i = 0; i < n; ++i) scanf("%lld", &a[i]); for (int i = 0; i < SQ; ++i) git[i] = true; sort(a, a+n); for (int i = n-1; i >= 0; --i) suf[i] = suf[i+1] + a[i]; while (m--) { scanf("%lld%lld", &d, &b); int kt = bins(b); if (kt == -1) { printf("0\n"); continue; } int lim, res = 0; if (kt%SQ == 0) lim = kt; else lim = kt+(SQ-kt%SQ); lim = min(lim, n); int wsk = kt/SQ; if (lim != kt) git[wsk] = false; for (int i = kt; i < lim; ++i) { re(i); res += lvl[i]+(d-kiedy[i])*a[i]-b; kiedy[i] = d; lvl[i] = b; } for (int i = lim; i < n; i += SQ) { int nr = i/SQ; if (git[nr]) { int spr = SQ; if (i+SQ >= n) spr = n-i; res += (suf[i]-suf[i+spr])*(d-ki[nr])+spr*(lv[nr]-b); ki[nr] = d; lv[nr] = b; continue; } for (int j = i; j < min(n, i+SQ); ++j) { re(j); res += lvl[j]+(d-kiedy[j])*a[j]-b; kiedy[j] = ki[nr]; lvl[j] = lv[nr]; } git[nr] = true; ki[nr] = d; lv[nr] = b; } printf("%lld\n", res); } } |
English