#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <set>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <cmath>
#include <bitset>
#include <fstream>
using namespace std;
#define pi pair<int,int>
#define mp(x,y) make_pair(x,y)
#define fi first
#define se second
#define pl pair<long long,long long>
#define pb push_back
#define vi vector<int>
#define ll long long
const int MAXN=1e6+5, mod=1e9+7;
ll t[MAXN],w[MAXN],czas,dod,sum[MAXN],akt;
bool byl[MAXN];
int szef[MAXN],kon[MAXN],ilu[MAXN],pocz[MAXN],n;
vector<int> lacz[MAXN];
int daj(int co)
{
if (szef[co]!=co)
szef[co]=daj(szef[co]);
return szef[co];
}
ll wnosi(int p, int k, ll kiedy)
{
return (t[p]+t[p]+kiedy*(k-p))*(k-p+1)/2-(sum[k]-sum[p-1]);
}
void polacz(int a, int b)
{
a=daj(a);
b=daj(b);
dod-=(ll)ilu[a]*(ilu[a]-1)/2;
dod-=(ll)ilu[b]*(ilu[b]-1)/2;
czas-=wnosi(pocz[a],kon[a],akt);
czas-=wnosi(pocz[b],kon[b],akt);
szef[a]=b;
ilu[b]+=ilu[a];
pocz[b]=pocz[a];
dod+=(ll)ilu[b]*(ilu[b]-1)/2;
czas+=wnosi(pocz[b],kon[b],akt);
if (kon[b]!=n)
{
ll x=(t[kon[b]+1]-t[pocz[b]])/ilu[b]+1;
if (x<=1000000)
lacz[x].pb(kon[b]);
}
}
int main ()
{
int a,b,c,d,e,f,g,z,k,m;
scanf("%d%d", &n, &m);
ilu[0]=1;
for (a=1; a<=n; a++)
{
scanf("%lld", &t[a]);
sum[a]=sum[a-1]+t[a];
kon[a]=pocz[a]=a;
ilu[a]=1;
szef[a]=a;
if ((ll)t[a]-t[a-1]+1<=1000000)
lacz[t[a]-t[a-1]+1].pb(a-1);
}
for (a=1; a<=1000000; a++)
{
czas+=dod;
akt=a;
for (c=0; c<lacz[a].size(); c++)
{
b=lacz[a][c];
if (byl[b])
continue;
else
{
byl[b]=1;
polacz(b,b+1);
}
}
w[a]=czas;
}
while (m--)
{
scanf("%d", &a);
printf("%lld\n", w[a]);
}
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 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <set> #include <vector> #include <queue> #include <stack> #include <map> #include <cmath> #include <bitset> #include <fstream> using namespace std; #define pi pair<int,int> #define mp(x,y) make_pair(x,y) #define fi first #define se second #define pl pair<long long,long long> #define pb push_back #define vi vector<int> #define ll long long const int MAXN=1e6+5, mod=1e9+7; ll t[MAXN],w[MAXN],czas,dod,sum[MAXN],akt; bool byl[MAXN]; int szef[MAXN],kon[MAXN],ilu[MAXN],pocz[MAXN],n; vector<int> lacz[MAXN]; int daj(int co) { if (szef[co]!=co) szef[co]=daj(szef[co]); return szef[co]; } ll wnosi(int p, int k, ll kiedy) { return (t[p]+t[p]+kiedy*(k-p))*(k-p+1)/2-(sum[k]-sum[p-1]); } void polacz(int a, int b) { a=daj(a); b=daj(b); dod-=(ll)ilu[a]*(ilu[a]-1)/2; dod-=(ll)ilu[b]*(ilu[b]-1)/2; czas-=wnosi(pocz[a],kon[a],akt); czas-=wnosi(pocz[b],kon[b],akt); szef[a]=b; ilu[b]+=ilu[a]; pocz[b]=pocz[a]; dod+=(ll)ilu[b]*(ilu[b]-1)/2; czas+=wnosi(pocz[b],kon[b],akt); if (kon[b]!=n) { ll x=(t[kon[b]+1]-t[pocz[b]])/ilu[b]+1; if (x<=1000000) lacz[x].pb(kon[b]); } } int main () { int a,b,c,d,e,f,g,z,k,m; scanf("%d%d", &n, &m); ilu[0]=1; for (a=1; a<=n; a++) { scanf("%lld", &t[a]); sum[a]=sum[a-1]+t[a]; kon[a]=pocz[a]=a; ilu[a]=1; szef[a]=a; if ((ll)t[a]-t[a-1]+1<=1000000) lacz[t[a]-t[a-1]+1].pb(a-1); } for (a=1; a<=1000000; a++) { czas+=dod; akt=a; for (c=0; c<lacz[a].size(); c++) { b=lacz[a][c]; if (byl[b]) continue; else { byl[b]=1; polacz(b,b+1); } } w[a]=czas; } while (m--) { scanf("%d", &a); printf("%lld\n", w[a]); } return 0; } |
English