#include "doll.h"
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define sz(x) (int)x.size()
#define ALL(x) begin(x), end(x)
#define loop(n, i) for (int i = 0; i < n; i++)
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<bool> vb;
void create_circuit(int M, vi A)
{
  vvi trees(19);
  int cnt = 2;
  for (int i = 1; i <= 18; i++)
  {
    // cnt - 1 switches indexed 1 .. cnt-1
    vb x(cnt);
    while (sz(trees[i]) < cnt)
    {
      int j = 1;
      while (j < cnt)
      {
        x[j].flip();
        if (!x[j])
          j = 2 * j + 1;
        else
          j *= 2;
      }
      trees[i].pb(j - cnt);
    }
    cnt *= 2;
  }
  int N = A.size();
  A.pb(0);
  vvi occ(M + 1);
  loop(sz(A), ix)
  {
    occ[A[ix]].pb(A[ix + 1]);
  }
  vi C(M + 1, -1);
  C[0] = A[0];
  int S = 0;
  vi X, Y;
  vi curOcc(M + 1);
  loop(N, i)
  {
    if (sz(occ[A[i]]) == 1)
    {
      C[A[i]] = A[i + 1];
    }
    else
    {
      if (curOcc[A[i]] == 0)
      {
        int pow = 1;
        int cnt = 2;
        while (cnt < sz(occ[A[i]]))
        {
          pow++;
          cnt *= 2;
        }
        int startIx = S;
        S += cnt - 1;
        loop(cnt - 1, i)
        {
          X.pb({});
          Y.pb({});
        }
        for (int i : occ[A[i]])
        {
          C[i] = -startIx;
        }
        for (int i = 1; i <= cnt; i++)
        {
          int l = 2 * i, r = 2 * i + 1;
          if (l >= cnt)
          {
            X[startIx + (i - 1)] = occ[A[i]][trees[pow][l - cnt]];
            Y[startIx + (i - 1)] = occ[A[i]][trees[pow][r - cnt]];
          }
          else
          {
            X[startIx + (i - 1)] = -(startIx + (l - 1));
            Y[startIx + (i - 1)] = -(startIx + (r - 1));
          }
        }
      }
    }
    curOcc[A[i]]++;
  }
  for (int &i : C)
    if (i == -1 && S == 0)
      i = 0;
  answer(C, X, Y);
}
| # | 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... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |