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
#include <iostream>
#include <vector>
#include <queue>
using namespace std;


int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n, k;
    cin >> n >> k;
    vector<vector<int> > plotno;
    plotno.resize(2);
    for (int i = 0; i < n; i++) {
        int x;
        cin >> x;
        plotno[0].push_back(x);
    }
    for (int i = 0; i < n; i++) {
        int x;
        cin >> x;
        plotno[1].push_back(x);
    }
    vector<int> ilosci;
    ilosci.resize(k + 1);
    for (int i = 1; i <= 2 * n; i++) {
        for (int j=i; j<=2*n; j++){
            //kolor musi byc w przedziale <i,j>
            vector<bool> odwiedzone;
            odwiedzone.resize(2*n, false);
            int obs=0;
            for (int x = 0; x < 2*n; x++) {
                if (odwiedzone[(x/n)*n+ x%n]) continue;
                if (plotno[x/n][x%n] >= i && plotno[x/n][x%n] <= j) {
                    queue<pair<int,int> > kolejka;
                    kolejka.push(make_pair(x/n, x%n));
                    odwiedzone[(x / n) * n + x % n] = 1;
                    while (!kolejka.empty()) {
        //cout << x << endl;
                        pair<int, int> tmp= kolejka.front();
                        //cout << i << " " << j <<" "<<x << " " << tmp.first << " " << tmp.second << endl;
                        kolejka.pop();
                        if (plotno[abs(tmp.first - 1)][tmp.second] >= i && plotno[abs(tmp.first - 1)][tmp.second] <= j && odwiedzone[abs(tmp.first-1)*n+ tmp.second] == 0) {
                            kolejka.push(make_pair(abs(tmp.first - 1), tmp.second));
                            odwiedzone[abs(tmp.first - 1) * n + tmp.second] = 1;
                        }
                        else odwiedzone[abs(tmp.first-1)*n+tmp.second] = 1;
                        if (plotno[tmp.first][(tmp.second+1)%n] >= i && plotno[tmp.first][(tmp.second+1)%n] <= j && odwiedzone[tmp.first*n + (tmp.second+1)%n] == 0) {
                            kolejka.push(make_pair(tmp.first, (tmp.second+1)%n));
                            odwiedzone[tmp.first * n + (tmp.second + 1) % n] = 1;
                        }
                        else odwiedzone[tmp.first * n + (tmp.second+1)%n] = 1;
                        if (plotno[tmp.first][(tmp.second - 1+n)%n] >= i && plotno[tmp.first][(tmp.second - 1+n)%n] <= j && odwiedzone[tmp.first * n + (tmp.second - 1+n)%n] == 0) {
                            kolejka.push(make_pair(tmp.first, (tmp.second - 1+n)%n));
                            odwiedzone[tmp.first * n + (tmp.second - 1 + n) % n] = 1;
                        }
                        else odwiedzone[tmp.first * n + (tmp.second - 1+n)%n] = 1;
    //cout << "D";
                        
                    }
                obs++;
                }
            }
            if (obs <= k) ilosci[obs]++;
        }
    }
    for (int i = 1; i <= k; i++) {
        printf("%i ", ilosci[i]);
    }
}