#include <bits/stdc++.h>
#define pii pair<int, int>
#define tii tuple<int, int, int>
#define lli long long
#define pb push_back
using namespace std;
#include "cave.h"
void solve(int l, int r, int x, bool b, int s[], int d[]){//b=1 se a porta x já estava para baixo antes
    if(l==r){//só sobrou uma opção
        s[l]=0;//testo qualquer um, poderia ser s[l]=1 tbm
        int tc = tryCombination(s);
        if(tc==x)s[l]=1;//se o resultado deu x, é pq a porta x está fechada, então s[l] tem que ser 1
        else s[l]=0;//se não deu igual a x é pq ela está aberta, então mantém 0;
        d[l]=x;//e o d[l] atualiso para x;
        return;
    }
    int mid = (l+r)/2;
    for (int i=l; i<=mid; i++){
        if(d[i]==-1){//se ainda não encontrei  resultado daquela porta...
            s[i]=1-s[i];//inverso metade dos interruptores
        }
    }
    int tc = tryCombination(s); //testo com metade invertida
    if(tc==x&&b==1){//se deu que a primeira fechada é o x e ele já estava fechado antes, então mudar a primeira metade não mudou o resultado
        solve(mid+1, r, x, 1, s, d);//logo, o botão do x está na segunda metade (a que não mudei nada) e na lista s o s[-] que guarda o do x está deixando o x fechado, b=1
    }else if (tc==x&&b==0){//se deu q x está fechado mas antes ele tava aberto
        solve(l, mid, x, 1, s, d);//ele tá na metade que eu mudei e agora está fechado, b=1
    }else if (tc!=x&&b==0){//se antes tava aberto e agora tbm, não mudou nada no x
        solve(mid+1, r, x, 0, s, d);//ele tá na metade que não mudei e está aberto, b=0;
    }else{//se estava antes fechado mas agora está aberto, mudou
        solve(l, mid, x, 0, s, d);//ele tá na metade que eu mudei e agora está aberto, b=0
    }
}
void exploreCave(int n){
    int s[n], d[n];
    for (int i=0; i<n; i++){
        d[i]=-1;
        s[i]=0;
    }
    int c = 0;
    for (int i=0; i<n; i++){//resolvo em ordem para garantir que ao testar uma combinação nova no solve não vai acotecer de uma porta com um i menor fechar na frente e eu não conseguir tem informações sobre o i que estou tentando achar
        int tc = tryCombination(s);
        if(tc==i){
            solve(0, n-1, i, 1, s, d);
        }else{
            solve(0, n-1, i, 0, s, d);
        }
    }
    answer(s, d);
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |