#include <iostream>
#include <vector>
#include <chrono>
#include <random>
#include <algorithm>
#include "mushrooms.h"
using namespace std;
vector<int> v1 = {0}, v2;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int count_mushrooms(int n){
vector<int> all;
for (int i=1;i<n;i++)
all.push_back(i);
for (int j=1;j<=10;j++){
for (int i=0;i<n-1;i++)
swap(all[i], all[rng() % (n - 1)]);
}
for (int i : {0, 1}){
if (all.size() == 0)
break;
if (use_machine({0, all.back()}) == 0)
v1.push_back(all.back());
else
v2.push_back(all.back());
all.pop_back();
}
int L = 3;
for (int i=3;all.size() > 0 and i<164 * 2;i+=2){
if (all.size() == 1){
if (use_machine({0, all.back()}))
v2.push_back(all.back());
else
v1.push_back(all.back());
all.pop_back();
break;
}
int a = all.back();
all.pop_back();
int b = all.back();
all.pop_back();
if (v1.size() > 1){
int x = use_machine({a, v1[0], b, v1[1]});
if ((x & 1) == 0)
v1.push_back(a);
else
v2.push_back(a);
if ((x & 2) == 0)
v1.push_back(b);
else
v2.push_back(b);
}
else{
int x = use_machine({a, v2[0], b, v2[1]});
if ((x & 1) == 0)
v2.push_back(a);
else
v1.push_back(a);
if ((x & 2) == 0)
v2.push_back(b);
else
v1.push_back(b);
}
L = i + 2;
}
int A = v1.size(), B = v2.size();
for (;all.size() > 0;){
int k = 0;
if (v1.size() > v2.size()){
vector<int> v = {v1[0]};
for (int j=1;all.size() > 0 and j < v1.size();j++){
v.push_back(all.back()), all.pop_back();
v.push_back(v1[j]);
k++;
}
int x = use_machine(v);
A += k - x / 2;
}
else{
vector<int> v = {v2[0]};
for (int j=1;all.size() > 0 and j < v2.size();j++){
v.push_back(all.back()), all.pop_back();
v.push_back(v2[j]);
k++;
}
int x = use_machine(v);
A += x / 2;
}
}
return A;
}