#include <iostream> #include <algorithm> #include <vector> #include <set> using namespace std; const int N = 2e5; const int M = 1e6; long long t[N + 7]; bool akt[N + 7]; int ile[N + 7]; int n, m; long long sumap = 0; struct ev { long long ti; int a, b; ev() : ti(0), a(0), b(0) {} ev(long long ti, int a, int b) : ti(ti), a(a), b(b) {} bool operator()(ev A, ev B) { if(A.ti == B.ti) { if(A.a == B.a) return A.b < B.b; else return A.a < B.a; } else return A.ti < B.ti; } }; set <ev, ev> T; set <int> S; long long res[M + 7]; int main() { ios_base::sync_with_stdio(0); cin >> n >> m; n++; for(int i = 2; i <= n; ++i) { cin >> t[i]; sumap += t[i]; } t[1] = 0; for(int i = 1; i <= n; ++i) { S.insert(i); akt[i] = 1; ile[i] = 1; if(i < n) { T.insert(ev(t[i + 1] - t[i], i, i + 1)); } } long long sum1 = 0; long long sum2 = 0; for(int i = 1; i <= n; ++i) sum2 += t[i]; for(int i = 0; i <= M; ++i) { while(!T.empty() && (*T.begin()).ti == i) { int a = (*T.begin()).a; int b = (*T.begin()).b; T.erase(T.begin()); if(!akt[a] || !akt[b]) continue; sum1 -= ((long long) ile[b] * (ile[b] - 1)) / 2; sum1 -= ((long long) ile[a] * (ile[a] - 1)) / 2; sum2 -= t[b] * ile[b]; sum2 -= t[a] * ile[a]; ile[a] += ile[b]; akt[b] = 0; sum1 += ((long long) ile[a] * (ile[a] - 1)) / 2; sum2 += t[a] * ile[a]; S.erase(b); auto it = S.find(a); it++; if(it != S.end()) { int bp = *it; long long nt = t[bp] - t[a] + ile[a] - 1; nt /= ile[a]; T.insert(ev(nt, a, bp)); } } res[i] = sum1 * i + sum2; } for(int i = 1; i <= m; ++i) { int q; cin >> q; cout << res[q] - sumap << '\n'; } 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 | #include <iostream> #include <algorithm> #include <vector> #include <set> using namespace std; const int N = 2e5; const int M = 1e6; long long t[N + 7]; bool akt[N + 7]; int ile[N + 7]; int n, m; long long sumap = 0; struct ev { long long ti; int a, b; ev() : ti(0), a(0), b(0) {} ev(long long ti, int a, int b) : ti(ti), a(a), b(b) {} bool operator()(ev A, ev B) { if(A.ti == B.ti) { if(A.a == B.a) return A.b < B.b; else return A.a < B.a; } else return A.ti < B.ti; } }; set <ev, ev> T; set <int> S; long long res[M + 7]; int main() { ios_base::sync_with_stdio(0); cin >> n >> m; n++; for(int i = 2; i <= n; ++i) { cin >> t[i]; sumap += t[i]; } t[1] = 0; for(int i = 1; i <= n; ++i) { S.insert(i); akt[i] = 1; ile[i] = 1; if(i < n) { T.insert(ev(t[i + 1] - t[i], i, i + 1)); } } long long sum1 = 0; long long sum2 = 0; for(int i = 1; i <= n; ++i) sum2 += t[i]; for(int i = 0; i <= M; ++i) { while(!T.empty() && (*T.begin()).ti == i) { int a = (*T.begin()).a; int b = (*T.begin()).b; T.erase(T.begin()); if(!akt[a] || !akt[b]) continue; sum1 -= ((long long) ile[b] * (ile[b] - 1)) / 2; sum1 -= ((long long) ile[a] * (ile[a] - 1)) / 2; sum2 -= t[b] * ile[b]; sum2 -= t[a] * ile[a]; ile[a] += ile[b]; akt[b] = 0; sum1 += ((long long) ile[a] * (ile[a] - 1)) / 2; sum2 += t[a] * ile[a]; S.erase(b); auto it = S.find(a); it++; if(it != S.end()) { int bp = *it; long long nt = t[bp] - t[a] + ile[a] - 1; nt /= ile[a]; T.insert(ev(nt, a, bp)); } } res[i] = sum1 * i + sum2; } for(int i = 1; i <= m; ++i) { int q; cin >> q; cout << res[q] - sumap << '\n'; } return 0; } |