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
#include <bits/stdc++.h>
#define qio ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define debug(x) cerr<<#x<<" "<<x<<endl
#define ll long long 
#define st first
#define nd second
using namespace std;

int n, k, val[3][100005], rep[200005], rang[200005], ile, res[12];
pair<int, int> pos[200005];

int find(int a) {
	if (a == rep[a]) return a;
	else return rep[a] = find(rep[a]);
}

void merge(int a, int b) {
	int x = find(a);
	int y = find(b);
	if (x != y) {
		if (rang[x] > rang[y]) {
			rep[y] = x;
			rang[x] += rang[y];
		}
		else {
			rep[x] = y;
			rang[y] += rang[x];
		}
		ile--;
	}
}

int main()
{
	qio;
	cin >> n >> k;
	for (int i = 1; i <= 2; i++) {
		for (int j = 1; j <= n; j++) {
			cin >> val[i][j];
			pos[val[i][j]] = { i,j };
		}
	}

	for (int i = 1; i <= 2 * n; i++) {
		ile = 0;
		for (int j = i; j <= 2 * n; j++) {
			rep[j] = j;
			rang[j] = 1;
			ile++;
			int x = pos[j].st;
			int y = pos[j].nd;
			int l = y - 1;
			int r = y + 1;
			int p = x - 1;
			if (l == 0) l = n;
			if (r == n + 1) r = 1;
			if (p == 0) p = 2;
			int a = val[x][l];
			int b = val[x][r];
			int c = val[p][y];
			if (a >= i && a <= j) merge(a, j);
			if (b >= i && b <= j) merge(b, j);
			if (c >= i && c <= j) merge(c, j);
			if (ile <= k) res[ile]++;
			//cout << i << " " << j << " " << ile << endl;
		}
		//cout << i << endl;
	}

	for (int i = 1; i <= k; i++) cout << res[i] << " ";
	cout << endl;
}