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
#include <bits/stdc++.h>
using namespace std;

int n, k;
int tab[200001];
int rep[200001];
int sz[200001];
int gdzie[200001];
int ile[11];

int fin(int x)
{
    if(rep[x] != x)
        rep[x] = fin(rep[x]);
    return rep[x];
}

int unio(int a, int b)
{
    int u = fin(a);
    int v = fin(b);
    if(u == v) return 0;
    if(sz[u] < sz[v]) swap(u, v);
    sz[u] += sz[v];
    rep[v] = u;
    return -1;
}

int main()
{
    scanf("%d%d", &n, &k);
    for(int i=0; i^2; ++i)
    {
        for(int j=0; j^n; ++j)
        {
            scanf("%d", &tab[i*100000 + j]);
            gdzie[tab[i*100000 + j]] = i*100000 + j;
        }
    }
    for(int i=1; i<=2*n; ++i) // pocz
    {
        int il = 0;
        for(int j=i; j<=2*n; ++j) // kon
        {
            int pos = gdzie[j];
            rep[pos] = pos;
            sz[pos] = 1;
            il++;

            if(pos >= 100000 && tab[pos-100000] >= i && tab[pos-100000] <= j)
                il += unio(pos, pos-100000);
            if(pos < 100000 && tab[pos+100000] >= i && tab[pos+100000] <= j)
                il += unio(pos, pos+100000);
                
            if(pos >= 100000)
            {
                if(pos == 100000 + n - 1 && tab[100000] >= i && tab[100000] <= j)
                    il += unio(pos, 100000);
                if(pos != 100000 + n - 1 && tab[pos+1] >= i && tab[pos+1] <= j)
                    il += unio(pos, pos+1);

                if(pos == 100000 && tab[100000+n-1] >= i && tab[100000+n-1] <= j)
                    il += unio(pos, 100000 + n - 1);
                if(pos != 100000 && tab[pos-1] >= i && tab[pos-1] <= j)
                    il += unio(pos, pos-1);
            }
            else
            {
                if(pos == n - 1 && tab[0] >= i && tab[0] <= j)
                    il += unio(pos, 0);
                if(pos != n - 1 && tab[pos+1] >= i && tab[pos+1] <= j)
                    il += unio(pos, pos+1);

                if(pos == 0 && tab[n-1] >= i && tab[n-1] <= j)
                    il += unio(pos, n - 1);
                if(pos != 0 && tab[pos-1] >= i && tab[pos-1] <= j)
                    il += unio(pos, pos-1);
            }

            // printf("%d %d %d\n", i, j, il);

            if(il <= k)
            {
                ile[il]++;
            }
        }
    }

    for(int i=0; i^k; ++i)
    {
        printf("%d ", ile[i+1]);
    }
    printf("\n");
}