#include "squarerect.h"
#include <bits/stdc++.h>
using namespace std;
bool am_i_square(int N, int Q) {
  int used = 0;
  int min_fill = (N * N + 24) / 25;
  int min_side = std::ceil(std::sqrt(min_fill));
  int x = N, y = N;
  for (int i = min_side; i <= N; i += min_side) {
    for (int j = min_side; j < i; j += min_side) {
      if (used++, inside_shape(i, j)) {
        x = i, y = j;
        goto found;
      }
      if (used++, inside_shape(j, i)) {
        x = j, y = i;
        goto found;
      }
    }
    if (N < i + min_side)
      goto found;
    if (used++, inside_shape(i, i)) {
      x = i, y = i;
      goto found;
    }
  }
found:
  int lo, hi;
  lo = x - min_side + 1, hi = std::min(x, N - min_side + 2);
  while (lo < hi) {
    int mi = lo + (hi - lo) / 2;
    if (used++, inside_shape(mi, y)) {
      hi = mi;
    } else {
      lo = mi + 1;
    }
  }
  x = lo;
  if (N < x + min_side - 1)
    return false;
  lo = y - min_side + 1, hi = std::min(y, N - min_side + 2);
  while (lo < hi) {
    int mi = lo + (hi - lo) / 2;
    if (used++, inside_shape(x, mi)) {
      hi = mi;
    } else {
      lo = mi + 1;
    }
  }
  y = lo;
  if (N < y + min_side - 1)
    return false;
  lo = min_side - 1, hi = std::min(N - x, N - y) + 1;
  while (lo < hi) {
    int mi = lo + (hi - lo) / 2;
    if (used++, !inside_shape(x + mi, y + mi)) {
      hi = mi;
    } else {
      lo = mi + 1;
    }
  }
  int side = lo;
  bool valid = side != min_side - 1;
  if (valid && x + side - 1 <= N && y + side <= N)
    valid &= !inside_shape(x + side - 1, y + side);
  if (valid && x + side <= N && y + side - 1 <= N)
    valid &= !inside_shape(x + side, y + side - 1);
  return valid;
}
| # | 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... |