#pragma GCC optimize("-Ofast")
#include <bits/stdc++.h>
#define maxn 100005
#define maxc 200010
#define maxk 11
#define N 262144
#define ll long long
#define pii pair <int, int>
#define fi first
#define se second
using namespace std;
int n, n2, k;
int wej[maxc];
ll wyn[maxk];
struct akt
{
pii prz;
int c;
};
vector <akt> akts[maxc];
void dodaj_akt(int tak1, int tak2, int nie1, int nie2)
{
if(tak1 > tak2) swap(tak1, tak2);
if(nie1 > nie2) swap(nie1, nie2);
if((tak1<=nie1&&nie1<=tak2) || (tak1<=nie2&&nie2<=tak2)) return;
pii poc = {1, tak1}, kon = {tak2, n2};
if(nie1 < tak1) poc.fi = max(poc.fi, nie1+1);
else kon.se = min(kon.se, nie1-1);
if(nie2 < tak1) poc.fi = max(poc.fi, nie2+1);
else kon.se = min(kon.se, nie2-1);
akts[poc.fi].push_back({kon, 1});
akts[poc.se+1].push_back({kon, -1});
}
struct info
{
pii t[maxk];// [ktore minimum] {wart, ile}
int przep;
info()
{
fill(t, t+maxk, make_pair(maxc, 0));
przep = 0;
}
} drz[N<<1];
void dodaj_prz(int p, int k, int c, int tp = 1, int tk = N, int w = 1)
{
if(p <= tp && tk <= k)
{
drz[w].t[0].fi+=c, drz[w].t[1].fi+=c, drz[w].t[2].fi+=c, drz[w].t[3].fi+=c, drz[w].t[4].fi+=c, drz[w].t[5].fi+=c, drz[w].t[6].fi+=c, drz[w].t[7].fi+=c, drz[w].t[8].fi+=c, drz[w].t[9].fi+=c, drz[w].t[10].fi+=c;
drz[w].przep += c;
return;
}
if(drz[w].przep)
{
drz[w<<1].t[0].fi+=drz[w].przep, drz[w<<1].t[1].fi+=drz[w].przep, drz[w<<1].t[2].fi+=drz[w].przep, drz[w<<1].t[3].fi+=drz[w].przep, drz[w<<1].t[4].fi+=drz[w].przep, drz[w<<1].t[5].fi+=drz[w].przep, drz[w<<1].t[6].fi+=drz[w].przep, drz[w<<1].t[7].fi+=drz[w].przep, drz[w<<1].t[8].fi+=drz[w].przep, drz[w<<1].t[9].fi+=drz[w].przep, drz[w<<1].t[10].fi+=drz[w].przep;
drz[w<<1].przep += drz[w].przep;
drz[(w<<1)+1].t[0].fi+=drz[w].przep, drz[(w<<1)+1].t[1].fi+=drz[w].przep, drz[(w<<1)+1].t[2].fi+=drz[w].przep, drz[(w<<1)+1].t[3].fi+=drz[w].przep, drz[(w<<1)+1].t[4].fi+=drz[w].przep, drz[(w<<1)+1].t[5].fi+=drz[w].przep, drz[(w<<1)+1].t[6].fi+=drz[w].przep, drz[(w<<1)+1].t[7].fi+=drz[w].przep, drz[(w<<1)+1].t[8].fi+=drz[w].przep, drz[(w<<1)+1].t[9].fi+=drz[w].przep, drz[(w<<1)+1].t[10].fi+=drz[w].przep;
drz[(w<<1)+1].przep += drz[w].przep;
drz[w].przep = 0;
}
int sr = (tp+tk)>>1;
if(p <= sr) dodaj_prz(p, k, c, tp, sr, w<<1);
if(sr < k) dodaj_prz(p, k, c, sr+1, tk, (w<<1)+1);
int ita = 0, itb = 0;
for(int i = 0; i < maxk; ++i)
{
drz[w].t[i].fi = min(drz[w<<1].t[ita].fi, drz[(w<<1)+1].t[itb].fi);
drz[w].t[i].se = 0;
if(drz[w<<1].t[ita].fi == drz[w].t[i].fi) drz[w].t[i].se += drz[w<<1].t[ita++].se;
if(drz[(w<<1)+1].t[itb].fi == drz[w].t[i].fi) drz[w].t[i].se += drz[(w<<1)+1].t[itb++].se;
if(drz[w].t[i].fi > drz[w].t[0].fi+10) break;
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n >> k;
n2 = n*2;
for(int i = 1; i <= n2; ++i) cin >> wej[i];
for(int i = 1; i <= n; ++i)
{
int i1 = i%n+1;
dodaj_akt(wej[i], wej[i], wej[i1], wej[n+i]);
dodaj_akt(wej[n+i], wej[n+i], wej[n+i1], wej[i]);
dodaj_akt(wej[i], wej[n+i], wej[i1], wej[n+i1]);
}
for(int i = 1; i <= n2; ++i) drz[N-1+i].t[0] = {0, 1};
for(int i = N-1; i; --i) drz[i].t[0] = {0, drz[i<<1].t[0].se+drz[(i<<1)+1].t[0].se};
for(int i = 1; i <= n2; ++i)
{
for(akt j : akts[i]) dodaj_prz(j.prz.fi, j.prz.se, j.c);
for(int j = 0; j <= k && drz[1].t[j].fi <= k; ++j) wyn[max(1, drz[1].t[j].fi)] += (ll)drz[1].t[j].se;
}
wyn[1] -= (((ll)n2)*((ll)(n2-1)))>>1ll;
for(int i = 1; i <= k; ++i) cout << wyn[i] << " ";
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 | #pragma GCC optimize("-Ofast") #include <bits/stdc++.h> #define maxn 100005 #define maxc 200010 #define maxk 11 #define N 262144 #define ll long long #define pii pair <int, int> #define fi first #define se second using namespace std; int n, n2, k; int wej[maxc]; ll wyn[maxk]; struct akt { pii prz; int c; }; vector <akt> akts[maxc]; void dodaj_akt(int tak1, int tak2, int nie1, int nie2) { if(tak1 > tak2) swap(tak1, tak2); if(nie1 > nie2) swap(nie1, nie2); if((tak1<=nie1&&nie1<=tak2) || (tak1<=nie2&&nie2<=tak2)) return; pii poc = {1, tak1}, kon = {tak2, n2}; if(nie1 < tak1) poc.fi = max(poc.fi, nie1+1); else kon.se = min(kon.se, nie1-1); if(nie2 < tak1) poc.fi = max(poc.fi, nie2+1); else kon.se = min(kon.se, nie2-1); akts[poc.fi].push_back({kon, 1}); akts[poc.se+1].push_back({kon, -1}); } struct info { pii t[maxk];// [ktore minimum] {wart, ile} int przep; info() { fill(t, t+maxk, make_pair(maxc, 0)); przep = 0; } } drz[N<<1]; void dodaj_prz(int p, int k, int c, int tp = 1, int tk = N, int w = 1) { if(p <= tp && tk <= k) { drz[w].t[0].fi+=c, drz[w].t[1].fi+=c, drz[w].t[2].fi+=c, drz[w].t[3].fi+=c, drz[w].t[4].fi+=c, drz[w].t[5].fi+=c, drz[w].t[6].fi+=c, drz[w].t[7].fi+=c, drz[w].t[8].fi+=c, drz[w].t[9].fi+=c, drz[w].t[10].fi+=c; drz[w].przep += c; return; } if(drz[w].przep) { drz[w<<1].t[0].fi+=drz[w].przep, drz[w<<1].t[1].fi+=drz[w].przep, drz[w<<1].t[2].fi+=drz[w].przep, drz[w<<1].t[3].fi+=drz[w].przep, drz[w<<1].t[4].fi+=drz[w].przep, drz[w<<1].t[5].fi+=drz[w].przep, drz[w<<1].t[6].fi+=drz[w].przep, drz[w<<1].t[7].fi+=drz[w].przep, drz[w<<1].t[8].fi+=drz[w].przep, drz[w<<1].t[9].fi+=drz[w].przep, drz[w<<1].t[10].fi+=drz[w].przep; drz[w<<1].przep += drz[w].przep; drz[(w<<1)+1].t[0].fi+=drz[w].przep, drz[(w<<1)+1].t[1].fi+=drz[w].przep, drz[(w<<1)+1].t[2].fi+=drz[w].przep, drz[(w<<1)+1].t[3].fi+=drz[w].przep, drz[(w<<1)+1].t[4].fi+=drz[w].przep, drz[(w<<1)+1].t[5].fi+=drz[w].przep, drz[(w<<1)+1].t[6].fi+=drz[w].przep, drz[(w<<1)+1].t[7].fi+=drz[w].przep, drz[(w<<1)+1].t[8].fi+=drz[w].przep, drz[(w<<1)+1].t[9].fi+=drz[w].przep, drz[(w<<1)+1].t[10].fi+=drz[w].przep; drz[(w<<1)+1].przep += drz[w].przep; drz[w].przep = 0; } int sr = (tp+tk)>>1; if(p <= sr) dodaj_prz(p, k, c, tp, sr, w<<1); if(sr < k) dodaj_prz(p, k, c, sr+1, tk, (w<<1)+1); int ita = 0, itb = 0; for(int i = 0; i < maxk; ++i) { drz[w].t[i].fi = min(drz[w<<1].t[ita].fi, drz[(w<<1)+1].t[itb].fi); drz[w].t[i].se = 0; if(drz[w<<1].t[ita].fi == drz[w].t[i].fi) drz[w].t[i].se += drz[w<<1].t[ita++].se; if(drz[(w<<1)+1].t[itb].fi == drz[w].t[i].fi) drz[w].t[i].se += drz[(w<<1)+1].t[itb++].se; if(drz[w].t[i].fi > drz[w].t[0].fi+10) break; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> k; n2 = n*2; for(int i = 1; i <= n2; ++i) cin >> wej[i]; for(int i = 1; i <= n; ++i) { int i1 = i%n+1; dodaj_akt(wej[i], wej[i], wej[i1], wej[n+i]); dodaj_akt(wej[n+i], wej[n+i], wej[n+i1], wej[i]); dodaj_akt(wej[i], wej[n+i], wej[i1], wej[n+i1]); } for(int i = 1; i <= n2; ++i) drz[N-1+i].t[0] = {0, 1}; for(int i = N-1; i; --i) drz[i].t[0] = {0, drz[i<<1].t[0].se+drz[(i<<1)+1].t[0].se}; for(int i = 1; i <= n2; ++i) { for(akt j : akts[i]) dodaj_prz(j.prz.fi, j.prz.se, j.c); for(int j = 0; j <= k && drz[1].t[j].fi <= k; ++j) wyn[max(1, drz[1].t[j].fi)] += (ll)drz[1].t[j].se; } wyn[1] -= (((ll)n2)*((ll)(n2-1)))>>1ll; for(int i = 1; i <= k; ++i) cout << wyn[i] << " "; return 0; } |
English