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


struct xxx{
	int ojciec, ranga;
}t[200009];
vector<int>v[200009];

void MakeSet(int x){
	t[x].ojciec=x;
	t[x].ranga=0;
}

int Find(int x){
	if(t[x].ojciec == x)
		return t[x].ojciec;
	t[x].ojciec=Find(t[x].ojciec);
	return t[x].ojciec;
}

void Union(int a, int b){
	int fa=Find(a);
	int fb=Find(b);
	if(fa==fb)return;
	if(fa==1 || (fb!=1 && t[fa].ranga>t[fb].ranga) ){
		t[fb].ojciec=t[fa].ojciec;
		t[fa].ranga++;
	}
	else{
		t[fa].ojciec=t[fb].ojciec;
		t[fb].ranga++;
	}
}

int d1[100009];
int d2[100009];
LL res[15];

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	int n, k;
	cin>>n>>k;
	for(int i=0; i<n; i++){
		cin>>d1[i];
	}
	for(int i=0; i<n; i++){
		cin>>d2[i];
	}
	for(int i=0; i<n; i++){
		v[d1[i]].push_back(d2[i]);
		v[d2[i]].push_back(d1[i]);
	}
	for(int i=0; i<n; i++){
		v[d1[i]].push_back(d1[(i+1)%n]);
		v[d1[(i+1)%n]].push_back(d1[i]);
		v[d2[i]].push_back(d2[(i+1)%n]);
		v[d2[(i+1)%n]].push_back(d2[i]);
	}
	for(int i=1; i<=2*n; i++){
		for(int j=1; j<=2*n; j++){
			MakeSet(j);
		}
		LL ile = 0;
		
		for(int j=i; j<=2*n; j++){
			int a = Find(v[j][0]);
			int b = Find(v[j][1]);
			int c = Find(v[j][2]);
			int kk=0;
			int rozne = 0;
			if(a!=b)rozne++;
			if(a!=c)rozne++;
			if(b!=c)rozne++;
			if(a==b && b==c && a==c)rozne=1;
			
			if(a >= i && a <= j){
				kk++;
				Union(a, j);
			}
			if(b >= i && b <= j){
				kk++;
				Union(b, j);
			}
			if(c >= i && c <= j){
				kk++;
				Union(c, j);
			}
			if(kk==0){
				ile++;
			}else{
				int rozne2=0;
				int aa = Find(v[j][0]);
				int bb = Find(v[j][1]);
				int cc = Find(v[j][2]);
				if(aa!=bb)rozne2++;
				if(aa!=cc)rozne2++;
				if(cc!=bb)rozne2++;
				if(aa==bb && bb==cc && aa==cc)rozne2=1;
				ile -= rozne - rozne2;
			}			
			if(ile < 15){
				res[ile]++;
			}
		}
	}
	for(int i=1; i<=k; i++){
		cout<<res[i]<<" ";
	}
	cout<<"\n";
	return 0;
}