#include <bits/stdc++.h>
using namespace std;
#ifndef _WIN32
#define getchar getchar_unlocked
#endif
#define MP make_pair
#define PB push_back
#define ST first
#define ND second
typedef long long int LLI;
typedef unsigned long long int LLU;
typedef long double LD;
typedef pair<int, int> pii;
typedef pair<long long int, long long int> pll;
typedef vector<int> vi;
template<class TH> void _dbg(const char *sdbg, TH h){cerr<<sdbg<<"="<<h<<"\n";}
template<class TH, class... TA> void _dbg(const char *sdbg, TH h, TA... a) {
while(*sdbg!=',') cerr<<*sdbg++;
cerr<<"="<<h<<",";
_dbg(sdbg+1, a...);
}
#define debug(...) _dbg(#__VA_ARGS__, __VA_ARGS__)
#define boost ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
const LLI INF = 3e12;
const int MX = 200007;
set<pll> zbior; //pozycja, nr
set<pll> kol; //moment, nr
LLI poz[MX]; int ilosc[MX];
LLI wyn[MX*5];
int n, kek;
LLI odp, dod;
LLI policz(int x){ if(x == n + 2) return -1;
LLI a = poz[x];
LLI b = (*(next(zbior.find({poz[x], x})))).ST;
return (b - a + ilosc[x] - 1)/ilosc[x];
}
LLI wzorek(int nr){
return poz[nr]*ilosc[nr] + (LLI(kek)*(ilosc[nr])*(ilosc[nr]-1))/2;
}
LLI wzorek2(int nr){
return LLI(ilosc[nr])*(ilosc[nr]-1)/2;
}
LLI wzorek1(int nr){
return poz[nr]*ilosc[nr];
}
void merge(int nr, bool b){
auto it = (next(zbior.find({poz[nr], nr})));
int nast = (*it).ND;
if(b){
odp -= wzorek1(nr); odp -= wzorek1(nast); dod -= wzorek2(nr); dod -= wzorek2(nast);
}
kol.erase({policz(nast), nast});
zbior.erase(it);
ilosc[nr] += ilosc[nast];
if(b){
odp += wzorek1(nr); dod += wzorek2(nr);
}
kol.insert({policz(nr), nr});
}
int32_t main()
{
int m; scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i){
scanf("%lld", &poz[i]); ilosc[i] = 1;
zbior.insert({poz[i], i});
}
zbior.insert({0, 0}); zbior.insert({-INF, n + 1}); zbior.insert({INF, n + 2}); poz[0] = 0; poz[n + 1] = -INF; poz[n + 2] = INF; ilosc[0] = 1; ilosc[n + 1] = 1; ilosc[n + 2] = 1;
for(pll p : zbior){
LLI mom = policz(p.ND);
if(mom != -1) kol.insert({mom, p.ND});
}
for(pll p : zbior)
if(0 <= p.ND && p.ND <= n) odp += wzorek(p.ND);
for(int d = 0; d <= 1000000; ++d){ kek = d;
while((*kol.begin()).ST <= d){
int nr = (*kol.begin()).ND; kol.erase(kol.begin());
merge(nr, 1);
}
wyn[d] = odp + d*dod;
}
for(int i = 1; i <= m; ++i){
int x; scanf("%d", &x);
printf("%lld\n", wyn[x] - wyn[0]);
}
}
/*
2 5
5 5
1 2 3 4 5
*/
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 | #include <bits/stdc++.h> using namespace std; #ifndef _WIN32 #define getchar getchar_unlocked #endif #define MP make_pair #define PB push_back #define ST first #define ND second typedef long long int LLI; typedef unsigned long long int LLU; typedef long double LD; typedef pair<int, int> pii; typedef pair<long long int, long long int> pll; typedef vector<int> vi; template<class TH> void _dbg(const char *sdbg, TH h){cerr<<sdbg<<"="<<h<<"\n";} template<class TH, class... TA> void _dbg(const char *sdbg, TH h, TA... a) { while(*sdbg!=',') cerr<<*sdbg++; cerr<<"="<<h<<","; _dbg(sdbg+1, a...); } #define debug(...) _dbg(#__VA_ARGS__, __VA_ARGS__) #define boost ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0) const LLI INF = 3e12; const int MX = 200007; set<pll> zbior; //pozycja, nr set<pll> kol; //moment, nr LLI poz[MX]; int ilosc[MX]; LLI wyn[MX*5]; int n, kek; LLI odp, dod; LLI policz(int x){ if(x == n + 2) return -1; LLI a = poz[x]; LLI b = (*(next(zbior.find({poz[x], x})))).ST; return (b - a + ilosc[x] - 1)/ilosc[x]; } LLI wzorek(int nr){ return poz[nr]*ilosc[nr] + (LLI(kek)*(ilosc[nr])*(ilosc[nr]-1))/2; } LLI wzorek2(int nr){ return LLI(ilosc[nr])*(ilosc[nr]-1)/2; } LLI wzorek1(int nr){ return poz[nr]*ilosc[nr]; } void merge(int nr, bool b){ auto it = (next(zbior.find({poz[nr], nr}))); int nast = (*it).ND; if(b){ odp -= wzorek1(nr); odp -= wzorek1(nast); dod -= wzorek2(nr); dod -= wzorek2(nast); } kol.erase({policz(nast), nast}); zbior.erase(it); ilosc[nr] += ilosc[nast]; if(b){ odp += wzorek1(nr); dod += wzorek2(nr); } kol.insert({policz(nr), nr}); } int32_t main() { int m; scanf("%d%d", &n, &m); for(int i = 1; i <= n; ++i){ scanf("%lld", &poz[i]); ilosc[i] = 1; zbior.insert({poz[i], i}); } zbior.insert({0, 0}); zbior.insert({-INF, n + 1}); zbior.insert({INF, n + 2}); poz[0] = 0; poz[n + 1] = -INF; poz[n + 2] = INF; ilosc[0] = 1; ilosc[n + 1] = 1; ilosc[n + 2] = 1; for(pll p : zbior){ LLI mom = policz(p.ND); if(mom != -1) kol.insert({mom, p.ND}); } for(pll p : zbior) if(0 <= p.ND && p.ND <= n) odp += wzorek(p.ND); for(int d = 0; d <= 1000000; ++d){ kek = d; while((*kol.begin()).ST <= d){ int nr = (*kol.begin()).ND; kol.erase(kol.begin()); merge(nr, 1); } wyn[d] = odp + d*dod; } for(int i = 1; i <= m; ++i){ int x; scanf("%d", &x); printf("%lld\n", wyn[x] - wyn[0]); } } /* 2 5 5 5 1 2 3 4 5 */ |
English