#include <bits/stdc++.h>
#include "coreputer.h"
using namespace std;
std::vector<int> malfunctioning_cores(int N)
{
if (N == 2){
int res = run_diagnostic({0});
if (res == 0) return {1,1};
else if (res == 1) return {1,0};
else return {0,1};
}
int l = 0, r = N-1;
int ch0 = 0;
while (l < r){
int mid = (l+r)/2;
vector<int> now;
for (int i = 0; i <= mid; i++) now.push_back(i);
int res = run_diagnostic(now);
if (res == -1) l = mid+1;
else{
if (res == 0) ch0 = 1;
r = mid;
}
}
int mid = l;
vector<int> ans;
for (int i = 0; i < N; i++) ans.push_back(0);
set<int> st;
l = mid-1;
r = mid+1;
if (ch0){
for (int i = 0; i <= mid; i++) st.insert(i);
while (l >= 0){
st.erase(l);
vector<int> ask;
for (int x : st) ask.push_back(x);
int res = run_diagnostic(ask);
if (res != 0) st.insert(l);
l--;
}
int cntl = (int)st.size();
for (int x : st) ans[x] = 1;
st.clear();
for (int i = mid; i < N; i++) st.insert(i);
while (r < N-1){
st.erase(r);
vector<int> ask;
for (int x : st) ask.push_back(x);
int res = run_diagnostic(ask);
if (res == 0){
cntl--;
st.insert(r);
}
r++;
}
for (int x : st){
if (x != N-1){
ans[x] = 1;
}
}
if (cntl) ans[N-1] = 1;
return ans;
}
else {
for (int i = 0; i <= mid; i++) st.insert(i);
while (l >= 0){
st.erase(l);
vector<int> ask;
for (int x : st) ask.push_back(x);
int res = run_diagnostic(ask);
if (res == -1) st.insert(l);
l--;
}
int cntl = (int)st.size() - 1;
for (int x : st) ans[x] = 1;
st.clear();
for (int i = mid; i < N; i++) st.insert(i);
while (r < N-1){
st.erase(r);
vector<int> ask;
for (int x : st) ask.push_back(x);
int res = run_diagnostic(ask);
if (res == -1){
cntl--;
st.insert(r);
}
r++;
}
for (int x : st){
if (x != N-1){
ans[x] = 1;
}
}
if (cntl) ans[N-1] = 1;
return ans;
}
return ans;
}