#include using namespace std; #line 2 "misc/interval-union.hpp" // Union of [a_1, b_1), [a_2, b_2), ... template vector> interval_union(const vector> &v) { vector> buf{v}, res; sort(begin(buf), end(buf)); for (auto &p : buf) { res.push_back(p); while ((int)res.size() >= 2) { int n = res.size(); if (res[n - 2].second < res[n - 1].first) break; pair q; q.first = res[n - 2].first; q.second = max(res[n - 2].second, res[n - 1].second); res.pop_back(); res.pop_back(); res.push_back(q); } } return res; } /** * @brief 区間の集合の直和 * https://nyaannyaan.github.io/library/misc/interval-union.hpp.html */ using ll = long long; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; ll k; cin >> n >> k; ll m = 2*k, ans = 0; vector a(n); for (auto& i : a) cin >> i; vector> g(n); vector d(n); for (int i=0; i> u >> v; u--; v--; g[u].push_back(v); g[v].push_back(u); d[u]++; d[v]++; } queue q; for (int i=0; i c; int v = rt, p = -1; do { c.push_back(a[v]); int u = -1; for (auto& w : g[v]) if (d[w] && w!=p) u = w; p = v; v = u; } while (v != rt); int z = c.size(); vector b(z); for (int i=1; i0 && x> gar; for (int i=0; i> ranges; ll cur = l; for (auto& [i, j] : interval_union(gar)) { if (cur < min(i,r+1)) ranges.emplace_back(cur,min(i,r+1)); cur = max(cur,j); } if (cur <= r) ranges.emplace_back(cur,r+1); vector> residues; for (auto& [i, j] : ranges) { if (m <= j-i) { residues.emplace_back(0,m); break; } ll x = i%m, y = (j-1)%m; if (x <= y) residues.emplace_back(x,y+1); else { residues.emplace_back(x,m); residues.emplace_back(0,y+1); } } residues = interval_union(residues); vector> ev; ll f = 0; for (int i=0; i0); ll x = ((i%2 ? b[i] : 1-b[i])%m+m)%m; if (x) ev.emplace_back(x,i%2 ? -1 : 1); } ev.emplace_back(m,0); sort(ev.begin(),ev.end()); ll best = numeric_limits::max(), prev = 0; int j = 0; for (auto& [i, j] : ev) { while (j<(int)residues.size() && residues[j].second<=prev) j++; if (prev::max() ? -1 : ans+best) << '\n'; }