#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; } |