#include "triangles.h"

#include <bits/stdc++.h>

using namespace std;

std::vector<std::vector<int>> solve(int n) {
    // cout << n << endl;
    // exit(1);
    if (n == 4) {
        vector<pair<Triangle, int>> a;
        for (int i = 0; i < 4; i++) {
            vector<int> cur;
            for (int j = 0; j < 4; j++) {
                if (i != j)
                    cur.push_back(j);
            }
            // for (auto j : cur) {
            //     cout << j << ' ';
            // }
            // cout << endl;
            a.push_back(make_pair(Triangle(cur[0], cur[1], cur[2]), i));
        }
        // cout << "ok" << endl;
        for (int it = 0; it < n - 1; it++) {
            for (int i = 0; i < n - 1 - it; i++) {
                // cout << i << endl;
                int res = compare({a[i].first}, {a[i + 1].first});
                if (res > 0) {
                    swap(a[i], a[i + 1]);
                }
            }
        }
        // cout << "ok2" << endl;
        if (compare({a[0].first, a[1].first, a[2].first}, {a[3].first}) == 0) {
            std::vector<std::vector<int>> ans;
            ans.push_back({a[3].second, a[3].first.j, a[3].first.k});
            ans.push_back({a[3].first.i, a[3].first.j, a[3].second});
            ans.push_back({a[3].first.i, a[3].second, a[3].first.k});
            // for (int i = 0; i < n; ++i) {
            //     ans[0][i] = i;
            // }
            return ans;
        } else {
            for (int i = 0; i < 3; i++) {
                vector<Triangle> ll;
                for (int j = 0; j < 3; j++) {
                    if (j != i)
                        ll.push_back(a[j].first);
                }
                if (compare(ll, {a[i].first, a[3].first}) == 0) {
                    set<int> qq = {a[3].second, a[i].second};
                    set<int> ww = {};
                    for (int q = 0; q < 3; q++) {
                        if (q != i)
                            ww.insert(a[q].second);
                    }
                    std::vector<std::vector<int>> ans;
                    ans.push_back(
                        {*ww.begin(), *(++qq.begin()), *(++ww.begin())});
                    ans.push_back({*qq.begin(), *ww.begin(), *(++ww.begin())});
                    // for (int i = 0; i < n; ++i) {
                    //     ans[0][i] = i;
                    // }
                    return ans;
                }
            }
        }
    }
    // vector<Triangle> a;
    Triangle cur = Triangle(0, 1, 2);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (i != j)
                for (int k = 0; k < n; k++) {
                    if (k != i && k != j)
                        if (compare({cur}, {Triangle(i, j, k)}) < 0) {
                            cur = Triangle(i, j, k);
                        }
                    // a.push_back(Triangle(i, j, k));
                }
        }
    }
    // cout << "ok" << endl;
    // for (int i = 0; i < a.size() - 1; i++) {
    //     // cout << i << endl;
    //     int res = compare({a[i]}, {a[i + 1]});
    //     if (res > 0) {
    //         swap(a[i], a[i + 1]);
    //     }
    // }
    std::vector<std::vector<int>> ans;
    ans.push_back({cur.i, cur.j, cur.k});
    return ans;
    // // Example of compare:
    // // Пример использования функции compare:
    // std::vector<Triangle> left = {Triangle(0, 1, 2)};
    // std::vector<Triangle> right = {Triangle(0, 1, 2)};
    // int compare_result = compare(left, right);
    // // compare_result should be equal to 0.
    // // compare_result будет равняться нулю, так как сравнивались одинаковые
    // // треугольники.

    // // Example of return:
    // // Пример возвращаемого значения:
    // std::vector<std::vector<int>> ans;
    // ans.push_back(std::vector<int>(n));
    // for (int i = 0; i < n; ++i) {
    //     ans[0][i] = i;
    // }
    // return ans;
}
