#include "rotate.h"
#include <bits/stdc++.h>
using namespace std;
template <typename T>
using pqg = priority_queue<T, vector<T>, greater<T>>;
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
// using namespace __gnu_pbds;
// template <typename T>
// using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
// #include <bits/stdc++.h>
// mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
// #define getrand(l, r) uniform_int_distribution<int>(l, r)(rng)
const long long infl = 1e18 + 1;
const int inf = 1e9 + 1;
const int mod1 = 1e9 + 7;
const int mod2 = 998244353;
const long double eps = 1e-7;
const int mod = 50000;
int add(int a, int b) { return (a + b) % mod; }
int sub(int a, int b) { return (a - b + mod) % mod; }
int mul(int a, int b) { return (int)((long long)a * b % mod); }
int pwr(int a, int b = mod - 2)
{
  int res = 1;
  for (; b > 0; b >>= 1, a = mul(a, a))
    if (b & 1)
      res = mul(res, a);
  return res;
}
int divi(int a, int b)
{
  return mul(a, pwr(b));
}
template <typename T>
bool chmax(T &a, T b)
{
  if (b > a)
  {
    a = b;
    return true;
  }
  return false;
}
template <typename T>
bool chmin(T &a, T b)
{
  if (b < a)
  {
    a = b;
    return true;
  }
  return false;
}
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define SZ(x) (int)x.size()
#define vec vector
#define dbg(x) cout << (#x) << " : " << x << endl;
using ll = long long;
using ull = unsigned long long;
void energy(int n, vector<int> v)
{
  vector<int> ord(n);
  iota(ord.begin(), ord.end(), 0);
  sort(ord.begin(), ord.end(), [&](int l, int r)
       { return v[l] < v[r]; });
  // brute force, everytime I will try to move the last rod as long as it won't decrease the result
  ll curr = 0;
  for (int i = 0; i < n; i++)
    for (int j = i + 1; j < n; j++)
      curr += min(abs(v[ord[i]] - v[ord[j]]), 50000 - abs(v[ord[i]] - v[ord[j]]));
  int all = 0;
  // for (int _ = 0; _ < 3; _++)
  // {
  //   for (int i = n - 1; i >= 0; i--)
  //   {
  //     auto check = [&](int md) -> ll
  //     {
  //       ll curr2 = curr;
  //       for (int j = 0; j < n; j++)
  //         curr2 -= min(abs(v[ord[i]] - v[ord[j]]), mod - abs(v[ord[i]] - v[ord[j]]));
  //       int x = (v[ord[i]] + md) % mod;
  //       for (int j = 0; j < n; j++)
  //         if (i != j)
  //           curr2 += min(abs(x - v[ord[j]]), mod - abs(x - v[ord[j]]));
  //       return curr2;
  //     };
  //     int l = 1, r = 50000 - v[ord[i]] - 1, ans = 1;
  //     if(i != n - 1)
  //       r = v[ord[i + 1]] - v[ord[i]] - 1;
  //     while (l <= r)
  //     {
  //       int md = (l + r) / 2;
  //       int md2 = md - 1;
  //       int x1 = check(md);
  //       int x2 = check(md2);
  //       if (x1 > x2)
  //       {
  //         l = md + 1;
  //         ans = md;
  //       }
  //       else
  //       {
  //         r = md - 1;
  //       }
  //     }
  //     ans--;
  //     ll curr2 = curr;
  //     for (int j = 0; j < n; j++)
  //       curr2 -= min(abs(v[ord[i]] - v[ord[j]]), mod - abs(v[ord[i]] - v[ord[j]]));
  //     int x = (v[ord[i]] + ans) % mod;
  //     for (int j = 0; j < n; j++)
  //       if (i != j)
  //         curr2 += min(abs(x - v[ord[j]]), mod - abs(x - v[ord[j]]));
  //     v[ord[i]] = x;
  //     if (ans != 0)
  //     {
  //       rotate({ord[i]}, ans);
  //       all++;
  //       assert(all <= 2e6);
  //     }
  //   }
  // // }
  // //   for (int _ = 0; _ < 3; _++)
  // // {
  //   for (int i = n - 1; i >= 0; i--)
  //   {
  //     auto check = [&](int md) -> ll
  //     {
  //       ll curr2 = curr;
  //       for (int j = 0; j < n; j++)
  //         curr2 -= min(abs(v[ord[i]] - v[ord[j]]), mod - abs(v[ord[i]] - v[ord[j]]));
  //       int x = (v[ord[i]] - md) % mod;
  //       for (int j = 0; j < n; j++)
  //         if (i != j)
  //           curr2 += min(abs(x - v[ord[j]]), mod - abs(x - v[ord[j]]));
  //       return curr2;
  //     };
  //     int l = 1, r = 1, ans = 1;
  //     if(i)
  //       r = -v[ord[i - 1]] + v[ord[i]] - 1;
  //     while (l <= r)
  //     {
  //       int md = (l + r) / 2;
  //       int md2 = md - 1;
  //       int x1 = check(md);
  //       int x2 = check(md2);
  //       if (x1 > x2)
  //       {
  //         l = md + 1;
  //         ans = md;
  //       }
  //       else
  //       {
  //         r = md - 1;
  //       }
  //     }
  //     ans--;
  //     ll curr2 = curr;
  //     for (int j = 0; j < n; j++)
  //       curr2 -= min(abs(v[ord[i]] - v[ord[j]]), mod - abs(v[ord[i]] - v[ord[j]]));
  //     int x = (v[ord[i]] - ans) % mod;
  //     for (int j = 0; j < n; j++)
  //       if (i != j)
  //         curr2 += min(abs(x - v[ord[j]]), mod - abs(x - v[ord[j]]));
  //     v[ord[i]] = x;
  //     if (ans != 0)
  //     {
  //       rotate({ord[i]}, -ans);
  //       all++;
  //       assert(all <= 2e6);
  //     }
  //   }
  // }
  // int all = 0;
  for (int _ = 0; _ < 3; _++)
  {
    for (int i = n - 1; i >= 0; i--)
    {
      while (true)
      {
        for (int k = 10; k >= 0; k--)
        {
          int take = 1 << k;
          if (k >= 3)
          {
            take = (v[ord[i]] + v[ord[(i + 1) % n]]) * k / (k - 1) - 1;
            take %= mod;
          }
          if (take > 50000 or take <= 0)
            continue;
          while (true)
          {
            int x = (v[ord[i]] + take) % mod;
            ll curr2 = curr;
            for (int j = 0; j < n; j++)
            {
              curr2 -= min(abs(v[ord[i]] - v[ord[j]]), mod - abs(v[ord[i]] - v[ord[j]]));
            }
            int temp = v[ord[i]];
            v[ord[i]] = x;
            for (int j = 0; j < n; j++)
            {
              curr2 += min(abs(v[ord[i]] - v[ord[j]]), mod - abs(v[ord[i]] - v[ord[j]]));
            }
            if (curr2 <= curr)
            {
              v[ord[i]] = temp;
              break;
            }
            all++;
            assert(all <= 2e6);
            rotate({ord[i]}, take);
            curr = curr2;
          }
        }
        break;
      }
    }
    for (int i = 0; i < n; i++)
    {
      int tmp = i;
      while (true)
      {
        // i = n - i - 1;
        for (int k = 10; k >= 0; k--)
        {
          int take = 1 << k;
          if (k >= 3)
          {
            take = (v[ord[i]] + v[ord[(i - 1 + n) % n]]) * k / (k - 1) - 1;
            take %= mod;
          }
          if (take > 50000 or take <= 0)
            continue;
          while (true)
          {
            int x = (v[ord[i]] - take + mod) % mod;
            ll curr2 = curr;
            for (int j = 0; j < n; j++)
            {
              curr2 -= min(abs(v[ord[i]] - v[ord[j]]), mod - abs(v[ord[i]] - v[ord[j]]));
            }
            int temp = v[ord[i]];
            v[ord[i]] = x;
            for (int j = 0; j < n; j++)
            {
              curr2 += min(abs(v[ord[i]] - v[ord[j]]), mod - abs(v[ord[i]] - v[ord[j]]));
            }
            if (curr2 <= curr)
            {
              v[ord[i]] = temp;
              break;
            }
            curr = curr2;
            all++;
            assert(all <= 2e6);
            rotate({ord[i]}, -take);
          }
        }
        break;
      }
      i = tmp;
    }
  }
}
| # | 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... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |