QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#739808 | #3061. Donut Drone | maspy | AC ✓ | 1779ms | 191528kb | C++23 | 40.0kb | 2024-11-12 23:13:48 | 2024-11-12 23:13:50 |
Judging History
answer
#line 1 "/home/maspy/compro/library/my_template.hpp"
#if defined(LOCAL)
#include <my_template_compiled.hpp>
#else
// https://codeforces.com/blog/entry/96344
#pragma GCC optimize("Ofast,unroll-loops")
// いまの CF だとこれ入れると動かない?
// #pragma GCC target("avx2,popcnt")
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using u8 = uint8_t;
using u16 = uint16_t;
using u32 = uint32_t;
using u64 = uint64_t;
using i128 = __int128;
using u128 = unsigned __int128;
using f128 = __float128;
template <class T>
constexpr T infty = 0;
template <>
constexpr int infty<int> = 1'010'000'000;
template <>
constexpr ll infty<ll> = 2'020'000'000'000'000'000;
template <>
constexpr u32 infty<u32> = infty<int>;
template <>
constexpr u64 infty<u64> = infty<ll>;
template <>
constexpr i128 infty<i128> = i128(infty<ll>) * 2'000'000'000'000'000'000;
template <>
constexpr double infty<double> = infty<ll>;
template <>
constexpr long double infty<long double> = infty<ll>;
using pi = pair<ll, ll>;
using vi = vector<ll>;
template <class T>
using vc = vector<T>;
template <class T>
using vvc = vector<vc<T>>;
template <class T>
using vvvc = vector<vvc<T>>;
template <class T>
using vvvvc = vector<vvvc<T>>;
template <class T>
using vvvvvc = vector<vvvvc<T>>;
template <class T>
using pq = priority_queue<T>;
template <class T>
using pqg = priority_queue<T, vector<T>, greater<T>>;
#define vv(type, name, h, ...) vector<vector<type>> name(h, vector<type>(__VA_ARGS__))
#define vvv(type, name, h, w, ...) vector<vector<vector<type>>> name(h, vector<vector<type>>(w, vector<type>(__VA_ARGS__)))
#define vvvv(type, name, a, b, c, ...) \
vector<vector<vector<vector<type>>>> name(a, vector<vector<vector<type>>>(b, vector<vector<type>>(c, vector<type>(__VA_ARGS__))))
// https://trap.jp/post/1224/
#define FOR1(a) for (ll _ = 0; _ < ll(a); ++_)
#define FOR2(i, a) for (ll i = 0; i < ll(a); ++i)
#define FOR3(i, a, b) for (ll i = a; i < ll(b); ++i)
#define FOR4(i, a, b, c) for (ll i = a; i < ll(b); i += (c))
#define FOR1_R(a) for (ll i = (a)-1; i >= ll(0); --i)
#define FOR2_R(i, a) for (ll i = (a)-1; i >= ll(0); --i)
#define FOR3_R(i, a, b) for (ll i = (b)-1; i >= ll(a); --i)
#define overload4(a, b, c, d, e, ...) e
#define overload3(a, b, c, d, ...) d
#define FOR(...) overload4(__VA_ARGS__, FOR4, FOR3, FOR2, FOR1)(__VA_ARGS__)
#define FOR_R(...) overload3(__VA_ARGS__, FOR3_R, FOR2_R, FOR1_R)(__VA_ARGS__)
#define FOR_subset(t, s) for (ll t = (s); t >= 0; t = (t == 0 ? -1 : (t - 1) & (s)))
#define all(x) x.begin(), x.end()
#define len(x) ll(x.size())
#define elif else if
#define eb emplace_back
#define mp make_pair
#define mt make_tuple
#define fi first
#define se second
#define stoi stoll
int popcnt(int x) { return __builtin_popcount(x); }
int popcnt(u32 x) { return __builtin_popcount(x); }
int popcnt(ll x) { return __builtin_popcountll(x); }
int popcnt(u64 x) { return __builtin_popcountll(x); }
int popcnt_sgn(int x) { return (__builtin_parity(x) & 1 ? -1 : 1); }
int popcnt_sgn(u32 x) { return (__builtin_parity(x) & 1 ? -1 : 1); }
int popcnt_sgn(ll x) { return (__builtin_parity(x) & 1 ? -1 : 1); }
int popcnt_sgn(u64 x) { return (__builtin_parity(x) & 1 ? -1 : 1); }
// (0, 1, 2, 3, 4) -> (-1, 0, 1, 1, 2)
int topbit(int x) { return (x == 0 ? -1 : 31 - __builtin_clz(x)); }
int topbit(u32 x) { return (x == 0 ? -1 : 31 - __builtin_clz(x)); }
int topbit(ll x) { return (x == 0 ? -1 : 63 - __builtin_clzll(x)); }
int topbit(u64 x) { return (x == 0 ? -1 : 63 - __builtin_clzll(x)); }
// (0, 1, 2, 3, 4) -> (-1, 0, 1, 0, 2)
int lowbit(int x) { return (x == 0 ? -1 : __builtin_ctz(x)); }
int lowbit(u32 x) { return (x == 0 ? -1 : __builtin_ctz(x)); }
int lowbit(ll x) { return (x == 0 ? -1 : __builtin_ctzll(x)); }
int lowbit(u64 x) { return (x == 0 ? -1 : __builtin_ctzll(x)); }
template <typename T>
T floor(T a, T b) {
return a / b - (a % b && (a ^ b) < 0);
}
template <typename T>
T ceil(T x, T y) {
return floor(x + y - 1, y);
}
template <typename T>
T bmod(T x, T y) {
return x - y * floor(x, y);
}
template <typename T>
pair<T, T> divmod(T x, T y) {
T q = floor(x, y);
return {q, x - q * y};
}
template <typename T, typename U>
T SUM(const vector<U> &A) {
T sm = 0;
for (auto &&a: A) sm += a;
return sm;
}
#define MIN(v) *min_element(all(v))
#define MAX(v) *max_element(all(v))
#define LB(c, x) distance((c).begin(), lower_bound(all(c), (x)))
#define UB(c, x) distance((c).begin(), upper_bound(all(c), (x)))
#define UNIQUE(x) sort(all(x)), x.erase(unique(all(x)), x.end()), x.shrink_to_fit()
template <typename T>
T POP(deque<T> &que) {
T a = que.front();
que.pop_front();
return a;
}
template <typename T>
T POP(pq<T> &que) {
T a = que.top();
que.pop();
return a;
}
template <typename T>
T POP(pqg<T> &que) {
T a = que.top();
que.pop();
return a;
}
template <typename T>
T POP(vc<T> &que) {
T a = que.back();
que.pop_back();
return a;
}
template <typename F>
ll binary_search(F check, ll ok, ll ng, bool check_ok = true) {
if (check_ok) assert(check(ok));
while (abs(ok - ng) > 1) {
auto x = (ng + ok) / 2;
(check(x) ? ok : ng) = x;
}
return ok;
}
template <typename F>
double binary_search_real(F check, double ok, double ng, int iter = 100) {
FOR(iter) {
double x = (ok + ng) / 2;
(check(x) ? ok : ng) = x;
}
return (ok + ng) / 2;
}
template <class T, class S>
inline bool chmax(T &a, const S &b) {
return (a < b ? a = b, 1 : 0);
}
template <class T, class S>
inline bool chmin(T &a, const S &b) {
return (a > b ? a = b, 1 : 0);
}
// ? は -1
vc<int> s_to_vi(const string &S, char first_char) {
vc<int> A(S.size());
FOR(i, S.size()) { A[i] = (S[i] != '?' ? S[i] - first_char : -1); }
return A;
}
template <typename T, typename U>
vector<T> cumsum(vector<U> &A, int off = 1) {
int N = A.size();
vector<T> B(N + 1);
FOR(i, N) { B[i + 1] = B[i] + A[i]; }
if (off == 0) B.erase(B.begin());
return B;
}
// stable sort
template <typename T>
vector<int> argsort(const vector<T> &A) {
vector<int> ids(len(A));
iota(all(ids), 0);
sort(all(ids), [&](int i, int j) { return (A[i] == A[j] ? i < j : A[i] < A[j]); });
return ids;
}
// A[I[0]], A[I[1]], ...
template <typename T>
vc<T> rearrange(const vc<T> &A, const vc<int> &I) {
vc<T> B(len(I));
FOR(i, len(I)) B[i] = A[I[i]];
return B;
}
template <typename T, typename... Vectors>
void concat(vc<T> &first, const Vectors &... others) {
vc<T> &res = first;
(res.insert(res.end(), others.begin(), others.end()), ...);
}
#endif
#line 1 "/home/maspy/compro/library/other/io.hpp"
#define FASTIO
#include <unistd.h>
// https://judge.yosupo.jp/submission/21623
namespace fastio {
static constexpr uint32_t SZ = 1 << 17;
char ibuf[SZ];
char obuf[SZ];
char out[100];
// pointer of ibuf, obuf
uint32_t pil = 0, pir = 0, por = 0;
struct Pre {
char num[10000][4];
constexpr Pre() : num() {
for (int i = 0; i < 10000; i++) {
int n = i;
for (int j = 3; j >= 0; j--) {
num[i][j] = n % 10 | '0';
n /= 10;
}
}
}
} constexpr pre;
inline void load() {
memcpy(ibuf, ibuf + pil, pir - pil);
pir = pir - pil + fread(ibuf + pir - pil, 1, SZ - pir + pil, stdin);
pil = 0;
if (pir < SZ) ibuf[pir++] = '\n';
}
inline void flush() {
fwrite(obuf, 1, por, stdout);
por = 0;
}
void rd(char &c) {
do {
if (pil + 1 > pir) load();
c = ibuf[pil++];
} while (isspace(c));
}
void rd(string &x) {
x.clear();
char c;
do {
if (pil + 1 > pir) load();
c = ibuf[pil++];
} while (isspace(c));
do {
x += c;
if (pil == pir) load();
c = ibuf[pil++];
} while (!isspace(c));
}
template <typename T>
void rd_real(T &x) {
string s;
rd(s);
x = stod(s);
}
template <typename T>
void rd_integer(T &x) {
if (pil + 100 > pir) load();
char c;
do
c = ibuf[pil++];
while (c < '-');
bool minus = 0;
if constexpr (is_signed<T>::value || is_same_v<T, i128>) {
if (c == '-') { minus = 1, c = ibuf[pil++]; }
}
x = 0;
while ('0' <= c) { x = x * 10 + (c & 15), c = ibuf[pil++]; }
if constexpr (is_signed<T>::value || is_same_v<T, i128>) {
if (minus) x = -x;
}
}
void rd(int &x) { rd_integer(x); }
void rd(ll &x) { rd_integer(x); }
void rd(i128 &x) { rd_integer(x); }
void rd(u32 &x) { rd_integer(x); }
void rd(u64 &x) { rd_integer(x); }
void rd(u128 &x) { rd_integer(x); }
void rd(double &x) { rd_real(x); }
void rd(long double &x) { rd_real(x); }
void rd(f128 &x) { rd_real(x); }
template <class T, class U>
void rd(pair<T, U> &p) {
return rd(p.first), rd(p.second);
}
template <size_t N = 0, typename T>
void rd_tuple(T &t) {
if constexpr (N < std::tuple_size<T>::value) {
auto &x = std::get<N>(t);
rd(x);
rd_tuple<N + 1>(t);
}
}
template <class... T>
void rd(tuple<T...> &tpl) {
rd_tuple(tpl);
}
template <size_t N = 0, typename T>
void rd(array<T, N> &x) {
for (auto &d: x) rd(d);
}
template <class T>
void rd(vc<T> &x) {
for (auto &d: x) rd(d);
}
void read() {}
template <class H, class... T>
void read(H &h, T &... t) {
rd(h), read(t...);
}
void wt(const char c) {
if (por == SZ) flush();
obuf[por++] = c;
}
void wt(const string s) {
for (char c: s) wt(c);
}
void wt(const char *s) {
size_t len = strlen(s);
for (size_t i = 0; i < len; i++) wt(s[i]);
}
template <typename T>
void wt_integer(T x) {
if (por > SZ - 100) flush();
if (x < 0) { obuf[por++] = '-', x = -x; }
int outi;
for (outi = 96; x >= 10000; outi -= 4) {
memcpy(out + outi, pre.num[x % 10000], 4);
x /= 10000;
}
if (x >= 1000) {
memcpy(obuf + por, pre.num[x], 4);
por += 4;
} else if (x >= 100) {
memcpy(obuf + por, pre.num[x] + 1, 3);
por += 3;
} else if (x >= 10) {
int q = (x * 103) >> 10;
obuf[por] = q | '0';
obuf[por + 1] = (x - q * 10) | '0';
por += 2;
} else
obuf[por++] = x | '0';
memcpy(obuf + por, out + outi + 4, 96 - outi);
por += 96 - outi;
}
template <typename T>
void wt_real(T x) {
ostringstream oss;
oss << fixed << setprecision(15) << double(x);
string s = oss.str();
wt(s);
}
void wt(int x) { wt_integer(x); }
void wt(ll x) { wt_integer(x); }
void wt(i128 x) { wt_integer(x); }
void wt(u32 x) { wt_integer(x); }
void wt(u64 x) { wt_integer(x); }
void wt(u128 x) { wt_integer(x); }
void wt(double x) { wt_real(x); }
void wt(long double x) { wt_real(x); }
void wt(f128 x) { wt_real(x); }
template <class T, class U>
void wt(const pair<T, U> val) {
wt(val.first);
wt(' ');
wt(val.second);
}
template <size_t N = 0, typename T>
void wt_tuple(const T t) {
if constexpr (N < std::tuple_size<T>::value) {
if constexpr (N > 0) { wt(' '); }
const auto x = std::get<N>(t);
wt(x);
wt_tuple<N + 1>(t);
}
}
template <class... T>
void wt(tuple<T...> tpl) {
wt_tuple(tpl);
}
template <class T, size_t S>
void wt(const array<T, S> val) {
auto n = val.size();
for (size_t i = 0; i < n; i++) {
if (i) wt(' ');
wt(val[i]);
}
}
template <class T>
void wt(const vector<T> val) {
auto n = val.size();
for (size_t i = 0; i < n; i++) {
if (i) wt(' ');
wt(val[i]);
}
}
void print() { wt('\n'); }
template <class Head, class... Tail>
void print(Head &&head, Tail &&... tail) {
wt(head);
if (sizeof...(Tail)) wt(' ');
print(forward<Tail>(tail)...);
}
// gcc expansion. called automaticall after main.
void __attribute__((destructor)) _d() { flush(); }
} // namespace fastio
using fastio::read;
using fastio::print;
using fastio::flush;
#if defined(LOCAL)
#define SHOW(...) SHOW_IMPL(__VA_ARGS__, SHOW6, SHOW5, SHOW4, SHOW3, SHOW2, SHOW1)(__VA_ARGS__)
#define SHOW_IMPL(_1, _2, _3, _4, _5, _6, NAME, ...) NAME
#define SHOW1(x) print(#x, "=", (x)), flush()
#define SHOW2(x, y) print(#x, "=", (x), #y, "=", (y)), flush()
#define SHOW3(x, y, z) print(#x, "=", (x), #y, "=", (y), #z, "=", (z)), flush()
#define SHOW4(x, y, z, w) print(#x, "=", (x), #y, "=", (y), #z, "=", (z), #w, "=", (w)), flush()
#define SHOW5(x, y, z, w, v) print(#x, "=", (x), #y, "=", (y), #z, "=", (z), #w, "=", (w), #v, "=", (v)), flush()
#define SHOW6(x, y, z, w, v, u) print(#x, "=", (x), #y, "=", (y), #z, "=", (z), #w, "=", (w), #v, "=", (v), #u, "=", (u)), flush()
#else
#define SHOW(...)
#endif
#define INT(...) \
int __VA_ARGS__; \
read(__VA_ARGS__)
#define LL(...) \
ll __VA_ARGS__; \
read(__VA_ARGS__)
#define U32(...) \
u32 __VA_ARGS__; \
read(__VA_ARGS__)
#define U64(...) \
u64 __VA_ARGS__; \
read(__VA_ARGS__)
#define STR(...) \
string __VA_ARGS__; \
read(__VA_ARGS__)
#define CHAR(...) \
char __VA_ARGS__; \
read(__VA_ARGS__)
#define DBL(...) \
double __VA_ARGS__; \
read(__VA_ARGS__)
#define VEC(type, name, size) \
vector<type> name(size); \
read(name)
#define VV(type, name, h, w) \
vector<vector<type>> name(h, vector<type>(w)); \
read(name)
void YES(bool t = 1) { print(t ? "YES" : "NO"); }
void NO(bool t = 1) { YES(!t); }
void Yes(bool t = 1) { print(t ? "Yes" : "No"); }
void No(bool t = 1) { Yes(!t); }
void yes(bool t = 1) { print(t ? "yes" : "no"); }
void no(bool t = 1) { yes(!t); }
#line 3 "main.cpp"
#line 1 "/home/maspy/compro/library/graph/ds/link_cut_tree.hpp"
/*
各 heavy path を head が左, tail が右となるように splay tree で持つ.
ユーザーが直接呼ぶ可能性があるものだけ int でも実装.
LCT 外で探索するときなど,push を忘れないように注意.
*/
template <typename Node>
struct Link_Cut_Tree {
using np = Node *;
int n;
vc<Node> nodes;
Link_Cut_Tree(int n = 0) : n(n), nodes(n) { FOR(i, n) nodes[i] = Node(i); }
Node *operator[](int v) { return &nodes[v]; }
// underlying tree の根
Node *get_root(Node *c) {
expose(c);
c->push();
while (c->l) {
c = c->l;
c->push();
}
splay(c);
return c;
}
// underlying tree の根
int get_root(int c) { return get_root(&nodes[c])->idx; }
// parent(c)==p となるように link.
void link(Node *c, Node *p) {
evert(c);
expose(p);
p->push();
// no edge -> heavy edge
assert(!(c->p));
assert(!(p->r));
c->p = p;
p->r = c;
p->update();
}
// parent(c)==p となるように link.
void link(int c, int p) { return link(&nodes[c], &nodes[p]); }
void cut(Node *a, Node *b) {
evert(a);
expose(b);
assert(!b->p);
assert((b->l) == a);
// heavy edge -> no edge
b->l->p = nullptr;
b->l = nullptr;
b->update();
}
void cut(int a, int b) { return cut(&nodes[a], &nodes[b]); }
// c を underlying tree の根とする.
// c は splay tree の根にもなる.
// c は push 済になる
void evert(Node *c) {
expose(c);
c->reverse();
c->push();
}
// c を underlying tree の根とする.
// c は splay tree の根にもなる.
void evert(int c) { evert(&nodes[c]); }
Node *lca(Node *u, Node *v) {
assert(get_root(u) == get_root(v));
expose(u);
return expose(v);
}
int lca(int u, int v) { return lca(&nodes[u], &nodes[v])->idx; }
// 辺の個数
int dist(int u, int v) {
evert(u), expose(v);
return ((*this)[v]->size) - 1;
}
Node *jump(Node *u, Node *v, int k) {
evert(v);
expose(u);
assert(0 <= k && k < (u->size));
while (1) {
u->push();
int rs = (u->r ? u->r->size : 0);
if (k < rs) {
u = u->r;
continue;
}
if (k == rs) { break; }
k -= rs + 1;
u = u->l;
}
splay(u);
return u;
}
int jump(int u, int v, int k) {
auto c = jump((*this)[u], (*this)[v], k);
return c->idx;
}
// [root, c] がひとつの splay tree になるように変更する.
// c が右端で splay tree の根という状態になる.
// path query はこの状態で c の data を見る.
// c は push 済になる
virtual Node *expose(Node *c) {
Node *now = c;
Node *rp = nullptr; // 今まで作ったパス
while (now) {
splay(now);
// heavy -> light, light -> heavy.
if (now->r) { now->add_light(now->r); }
if (rp) { now->erase_light(rp); }
now->r = rp;
now->update();
rp = now;
now = now->p;
}
splay(c);
return rp;
}
// [root, c] がひとつの splay tree になるように変更する.
// c が右端で splay tree の根という状態になる.
// path query はこの状態で c の data を見る.
int expose(int c) {
Node *x = expose(&nodes[c]);
if (!x) return -1;
return x->idx;
}
Node *get_parent(Node *x) {
expose(x);
x->push();
if (!x->l) return nullptr;
x = x->l, x->push();
while (x->r) x = x->r, x->push();
return x;
}
int get_parent(int x) {
Node *p = get_parent((*this)[x]);
return (p ? p->idx : -1);
}
void set(Node *c, typename Node::VX x) {
evert(c);
c->set(x);
}
void set(int c, typename Node::VX x) { set((*this)[c], x); }
typename Node::X prod_path(int a, int b) {
evert(a), expose(b);
return (*this)[b]->x;
}
// subtree 用の node を使う
typename Node::X prod_subtree(int v, int root) {
static_assert(Node::NODE_FOR_SUBTREE);
if (v == root) {
evert(root);
return (*this)[root]->x;
}
root = jump(v, root, 1);
cut(v, root);
typename Node::X res = (*this)[v]->x;
link(v, root);
return res;
}
vc<int> collect_heavy_path(int v) {
np c = (*this)[v];
while (!is_root(c)) c = c->p;
vc<int> res;
auto dfs = [&](auto &dfs, np c, bool rev) -> void {
if (!rev) {
if (c->l) dfs(dfs, c->l, rev ^ c->rev);
res.eb(c->idx);
if (c->r) dfs(dfs, c->r, rev ^ c->rev);
} else {
if (c->r) dfs(dfs, c->r, rev ^ c->rev);
res.eb(c->idx);
if (c->l) dfs(dfs, c->l, rev ^ c->rev);
}
};
dfs(dfs, c, false);
return res;
}
void debug() {
print("p, l, r, rev");
auto f = [&](np c) -> int { return (c ? c->idx : -1); };
FOR(i, len(nodes)) { print(i, ",", f((*this)[i]->p), f((*this)[i]->l), f((*this)[i]->r), (*this)[i]->rev); }
FOR(i, len(nodes)) {
np c = (*this)[i];
if (c->l) assert(c->l->p == c);
if (c->r) assert(c->r->p == c);
}
}
private:
// splay tree 内で完結する操作. 特に heavy, light 構造は変わらない.
// light pointer は rotate 内でケア
// c は push 済になる
void splay(Node *c) {
c->push();
while (!is_root(c)) {
Node *p = c->p;
Node *pp = (p ? p->p : nullptr);
if (state(p) == 0) {
p->push(), c->push();
rotate(c);
}
elif (state(c) == state(p)) {
pp->push(), p->push(), c->push();
rotate(p);
rotate(c);
}
else {
pp->push(), p->push(), c->push();
rotate(c);
rotate(c);
}
}
}
// パスを表す splay tree の根になっているかどうか
// underlying tree ではない
bool is_root(Node *c) { return state(c) == 0; }
// splay tree 内で完結する操作. 特に heavy, light 構造は変わらない.
// light edge のポインタは変更されうる
void rotate(Node *n) {
// n を根に近づける
Node *pp, *p, *c;
p = n->p;
pp = p->p;
if (p->l == n) {
c = n->r;
n->r = p;
p->l = c;
} else {
c = n->l;
n->l = p;
p->r = c;
}
p->update(), n->update();
if (pp) {
if (pp->l == p) pp->l = n;
elif (pp->r == p) pp->r = n;
else {
// light edge pointer が (pp-p) から (pp-n) に変わる
pp->change_light(p, n);
}
}
n->p = pp;
p->p = n;
if (c) c->p = p;
}
inline int state(Node *n) {
if (!n->p) return 0;
if (n->p->l == n) return 1;
if (n->p->r == n) return -1;
return 0;
}
};
#line 1 "/home/maspy/compro/library/graph/ds/lct_node_base.hpp"
// SUBTREE : cluster が subtree 情報を持つ場合
struct LCT_Node_Base {
using np = LCT_Node_Base*;
// デフォルト
np l, r, p;
int idx, size; // size は heavy path の頂点数
bool rev;
using X = int;
using VX = int;
LCT_Node_Base(int i = 0)
: l(nullptr), r(nullptr), p(nullptr), idx(i), size(1), rev(0) {}
void update() {
size = 1;
if (l) { size += l->size; }
if (r) { size += r->size; }
}
void push() {
if (rev) {
if (l) l->reverse();
if (r) r->reverse();
rev = 0;
}
}
// data の reverse も行う
void reverse() {
rev ^= 1;
swap(l, r);
}
// LCT 内で expose, update を行うのでここは変更だけ
void set(VX x) {}
void add_light(np c) {}
void erase_light(np c) {}
// b->x に subtree value が入っている.
void change_light(np a, np b) {}
};
#line 2 "/home/maspy/compro/library/graph/tree.hpp"
#line 2 "/home/maspy/compro/library/graph/base.hpp"
template <typename T>
struct Edge {
int frm, to;
T cost;
int id;
};
template <typename T = int, bool directed = false>
struct Graph {
static constexpr bool is_directed = directed;
int N, M;
using cost_type = T;
using edge_type = Edge<T>;
vector<edge_type> edges;
vector<int> indptr;
vector<edge_type> csr_edges;
vc<int> vc_deg, vc_indeg, vc_outdeg;
bool prepared;
class OutgoingEdges {
public:
OutgoingEdges(const Graph* G, int l, int r) : G(G), l(l), r(r) {}
const edge_type* begin() const {
if (l == r) { return 0; }
return &G->csr_edges[l];
}
const edge_type* end() const {
if (l == r) { return 0; }
return &G->csr_edges[r];
}
private:
const Graph* G;
int l, r;
};
bool is_prepared() { return prepared; }
Graph() : N(0), M(0), prepared(0) {}
Graph(int N) : N(N), M(0), prepared(0) {}
void build(int n) {
N = n, M = 0;
prepared = 0;
edges.clear();
indptr.clear();
csr_edges.clear();
vc_deg.clear();
vc_indeg.clear();
vc_outdeg.clear();
}
void add(int frm, int to, T cost = 1, int i = -1) {
assert(!prepared);
assert(0 <= frm && 0 <= to && to < N);
if (i == -1) i = M;
auto e = edge_type({frm, to, cost, i});
edges.eb(e);
++M;
}
#ifdef FASTIO
// wt, off
void read_tree(bool wt = false, int off = 1) { read_graph(N - 1, wt, off); }
void read_graph(int M, bool wt = false, int off = 1) {
for (int m = 0; m < M; ++m) {
INT(a, b);
a -= off, b -= off;
if (!wt) {
add(a, b);
} else {
T c;
read(c);
add(a, b, c);
}
}
build();
}
#endif
void build() {
assert(!prepared);
prepared = true;
indptr.assign(N + 1, 0);
for (auto&& e: edges) {
indptr[e.frm + 1]++;
if (!directed) indptr[e.to + 1]++;
}
for (int v = 0; v < N; ++v) { indptr[v + 1] += indptr[v]; }
auto counter = indptr;
csr_edges.resize(indptr.back() + 1);
for (auto&& e: edges) {
csr_edges[counter[e.frm]++] = e;
if (!directed)
csr_edges[counter[e.to]++] = edge_type({e.to, e.frm, e.cost, e.id});
}
}
OutgoingEdges operator[](int v) const {
assert(prepared);
return {this, indptr[v], indptr[v + 1]};
}
vc<int> deg_array() {
if (vc_deg.empty()) calc_deg();
return vc_deg;
}
pair<vc<int>, vc<int>> deg_array_inout() {
if (vc_indeg.empty()) calc_deg_inout();
return {vc_indeg, vc_outdeg};
}
int deg(int v) {
if (vc_deg.empty()) calc_deg();
return vc_deg[v];
}
int in_deg(int v) {
if (vc_indeg.empty()) calc_deg_inout();
return vc_indeg[v];
}
int out_deg(int v) {
if (vc_outdeg.empty()) calc_deg_inout();
return vc_outdeg[v];
}
#ifdef FASTIO
void debug() {
print("Graph");
if (!prepared) {
print("frm to cost id");
for (auto&& e: edges) print(e.frm, e.to, e.cost, e.id);
} else {
print("indptr", indptr);
print("frm to cost id");
FOR(v, N) for (auto&& e: (*this)[v]) print(e.frm, e.to, e.cost, e.id);
}
}
#endif
vc<int> new_idx;
vc<bool> used_e;
// G における頂点 V[i] が、新しいグラフで i になるようにする
// {G, es}
// sum(deg(v)) の計算量になっていて、
// 新しいグラフの n+m より大きい可能性があるので注意
Graph<T, directed> rearrange(vc<int> V, bool keep_eid = 0) {
if (len(new_idx) != N) new_idx.assign(N, -1);
int n = len(V);
FOR(i, n) new_idx[V[i]] = i;
Graph<T, directed> G(n);
vc<int> history;
FOR(i, n) {
for (auto&& e: (*this)[V[i]]) {
if (len(used_e) <= e.id) used_e.resize(e.id + 1);
if (used_e[e.id]) continue;
int a = e.frm, b = e.to;
if (new_idx[a] != -1 && new_idx[b] != -1) {
history.eb(e.id);
used_e[e.id] = 1;
int eid = (keep_eid ? e.id : -1);
G.add(new_idx[a], new_idx[b], e.cost, eid);
}
}
}
FOR(i, n) new_idx[V[i]] = -1;
for (auto&& eid: history) used_e[eid] = 0;
G.build();
return G;
}
Graph<T, true> to_directed_tree(int root = -1) {
if (root == -1) root = 0;
assert(!is_directed && prepared && M == N - 1);
Graph<T, true> G1(N);
vc<int> par(N, -1);
auto dfs = [&](auto& dfs, int v) -> void {
for (auto& e: (*this)[v]) {
if (e.to == par[v]) continue;
par[e.to] = v, dfs(dfs, e.to);
}
};
dfs(dfs, root);
for (auto& e: edges) {
int a = e.frm, b = e.to;
if (par[a] == b) swap(a, b);
assert(par[b] == a);
G1.add(a, b, e.cost);
}
G1.build();
return G1;
}
private:
void calc_deg() {
assert(vc_deg.empty());
vc_deg.resize(N);
for (auto&& e: edges) vc_deg[e.frm]++, vc_deg[e.to]++;
}
void calc_deg_inout() {
assert(vc_indeg.empty());
vc_indeg.resize(N);
vc_outdeg.resize(N);
for (auto&& e: edges) { vc_indeg[e.to]++, vc_outdeg[e.frm]++; }
}
};
#line 4 "/home/maspy/compro/library/graph/tree.hpp"
// HLD euler tour をとっていろいろ。
template <typename GT>
struct Tree {
using Graph_type = GT;
GT &G;
using WT = typename GT::cost_type;
int N;
vector<int> LID, RID, head, V, parent, VtoE;
vc<int> depth;
vc<WT> depth_weighted;
Tree(GT &G, int r = 0, bool hld = 1) : G(G) { build(r, hld); }
void build(int r = 0, bool hld = 1) {
if (r == -1) return; // build を遅延したいとき
N = G.N;
LID.assign(N, -1), RID.assign(N, -1), head.assign(N, r);
V.assign(N, -1), parent.assign(N, -1), VtoE.assign(N, -1);
depth.assign(N, -1), depth_weighted.assign(N, 0);
assert(G.is_prepared());
int t1 = 0;
dfs_sz(r, -1, hld);
dfs_hld(r, t1);
}
void dfs_sz(int v, int p, bool hld) {
auto &sz = RID;
parent[v] = p;
depth[v] = (p == -1 ? 0 : depth[p] + 1);
sz[v] = 1;
int l = G.indptr[v], r = G.indptr[v + 1];
auto &csr = G.csr_edges;
// 使う辺があれば先頭にする
for (int i = r - 2; i >= l; --i) {
if (hld && depth[csr[i + 1].to] == -1) swap(csr[i], csr[i + 1]);
}
int hld_sz = 0;
for (int i = l; i < r; ++i) {
auto e = csr[i];
if (depth[e.to] != -1) continue;
depth_weighted[e.to] = depth_weighted[v] + e.cost;
VtoE[e.to] = e.id;
dfs_sz(e.to, v, hld);
sz[v] += sz[e.to];
if (hld && chmax(hld_sz, sz[e.to]) && l < i) { swap(csr[l], csr[i]); }
}
}
void dfs_hld(int v, int ×) {
LID[v] = times++;
RID[v] += LID[v];
V[LID[v]] = v;
bool heavy = true;
for (auto &&e: G[v]) {
if (depth[e.to] <= depth[v]) continue;
head[e.to] = (heavy ? head[v] : e.to);
heavy = false;
dfs_hld(e.to, times);
}
}
vc<int> heavy_path_at(int v) {
vc<int> P = {v};
while (1) {
int a = P.back();
for (auto &&e: G[a]) {
if (e.to != parent[a] && head[e.to] == v) {
P.eb(e.to);
break;
}
}
if (P.back() == a) break;
}
return P;
}
int heavy_child(int v) {
int k = LID[v] + 1;
if (k == N) return -1;
int w = V[k];
return (parent[w] == v ? w : -1);
}
int e_to_v(int eid) {
auto e = G.edges[eid];
return (parent[e.frm] == e.to ? e.frm : e.to);
}
int v_to_e(int v) { return VtoE[v]; }
int get_eid(int u, int v) {
if (parent[u] != v) swap(u, v);
assert(parent[u] == v);
return VtoE[u];
}
int ELID(int v) { return 2 * LID[v] - depth[v]; }
int ERID(int v) { return 2 * RID[v] - depth[v] - 1; }
// 目標地点へ進む個数が k
int LA(int v, int k) {
assert(k <= depth[v]);
while (1) {
int u = head[v];
if (LID[v] - k >= LID[u]) return V[LID[v] - k];
k -= LID[v] - LID[u] + 1;
v = parent[u];
}
}
int la(int u, int v) { return LA(u, v); }
int LCA(int u, int v) {
for (;; v = parent[head[v]]) {
if (LID[u] > LID[v]) swap(u, v);
if (head[u] == head[v]) return u;
}
}
int meet(int a, int b, int c) { return LCA(a, b) ^ LCA(a, c) ^ LCA(b, c); }
int lca(int u, int v) { return LCA(u, v); }
int subtree_size(int v, int root = -1) {
if (root == -1) return RID[v] - LID[v];
if (v == root) return N;
int x = jump(v, root, 1);
if (in_subtree(v, x)) return RID[v] - LID[v];
return N - RID[x] + LID[x];
}
int dist(int a, int b) {
int c = LCA(a, b);
return depth[a] + depth[b] - 2 * depth[c];
}
WT dist_weighted(int a, int b) {
int c = LCA(a, b);
return depth_weighted[a] + depth_weighted[b] - WT(2) * depth_weighted[c];
}
// a is in b
bool in_subtree(int a, int b) { return LID[b] <= LID[a] && LID[a] < RID[b]; }
int jump(int a, int b, ll k) {
if (k == 1) {
if (a == b) return -1;
return (in_subtree(b, a) ? LA(b, depth[b] - depth[a] - 1) : parent[a]);
}
int c = LCA(a, b);
int d_ac = depth[a] - depth[c];
int d_bc = depth[b] - depth[c];
if (k > d_ac + d_bc) return -1;
if (k <= d_ac) return LA(a, k);
return LA(b, d_ac + d_bc - k);
}
vc<int> collect_child(int v) {
vc<int> res;
for (auto &&e: G[v])
if (e.to != parent[v]) res.eb(e.to);
return res;
}
vc<int> collect_light(int v) {
vc<int> res;
bool skip = true;
for (auto &&e: G[v])
if (e.to != parent[v]) {
if (!skip) res.eb(e.to);
skip = false;
}
return res;
}
vc<pair<int, int>> get_path_decomposition(int u, int v, bool edge) {
// [始点, 終点] の"閉"区間列。
vc<pair<int, int>> up, down;
while (1) {
if (head[u] == head[v]) break;
if (LID[u] < LID[v]) {
down.eb(LID[head[v]], LID[v]);
v = parent[head[v]];
} else {
up.eb(LID[u], LID[head[u]]);
u = parent[head[u]];
}
}
if (LID[u] < LID[v]) down.eb(LID[u] + edge, LID[v]);
elif (LID[v] + edge <= LID[u]) up.eb(LID[u], LID[v] + edge);
reverse(all(down));
up.insert(up.end(), all(down));
return up;
}
// 辺の列の情報 (frm,to,str)
// str = "heavy_up", "heavy_down", "light_up", "light_down"
vc<tuple<int, int, string>> get_path_decomposition_detail(int u, int v) {
vc<tuple<int, int, string>> up, down;
while (1) {
if (head[u] == head[v]) break;
if (LID[u] < LID[v]) {
if (v != head[v]) down.eb(head[v], v, "heavy_down"), v = head[v];
down.eb(parent[v], v, "light_down"), v = parent[v];
} else {
if (u != head[u]) up.eb(u, head[u], "heavy_up"), u = head[u];
up.eb(u, parent[u], "light_up"), u = parent[u];
}
}
if (LID[u] < LID[v]) down.eb(u, v, "heavy_down");
elif (LID[v] < LID[u]) up.eb(u, v, "heavy_up");
reverse(all(down));
concat(up, down);
return up;
}
vc<int> restore_path(int u, int v) {
vc<int> P;
for (auto &&[a, b]: get_path_decomposition(u, v, 0)) {
if (a <= b) {
FOR(i, a, b + 1) P.eb(V[i]);
} else {
FOR_R(i, b, a + 1) P.eb(V[i]);
}
}
return P;
}
// path [a,b] と [c,d] の交わり. 空ならば {-1,-1}.
// https://codeforces.com/problemset/problem/500/G
pair<int, int> path_intersection(int a, int b, int c, int d) {
int ab = lca(a, b), ac = lca(a, c), ad = lca(a, d);
int bc = lca(b, c), bd = lca(b, d), cd = lca(c, d);
int x = ab ^ ac ^ bc, y = ab ^ ad ^ bd; // meet(a,b,c), meet(a,b,d)
if (x != y) return {x, y};
int z = ac ^ ad ^ cd;
if (x != z) x = -1;
return {x, x};
}
// uv path 上で check(v) を満たす最後の v
// なければ (つまり check(v) が ng )-1
template <class F>
int max_path(F check, int u, int v) {
if (!check(u)) return -1;
auto pd = get_path_decomposition(u, v, false);
for (auto [a, b]: pd) {
if (!check(V[a])) return u;
if (check(V[b])) {
u = V[b];
continue;
}
int c = binary_search([&](int c) -> bool { return check(V[c]); }, a, b, 0);
return V[c];
}
return u;
}
};
#line 2 "/home/maspy/compro/library/ds/unionfind/unionfind.hpp"
struct UnionFind {
int n, n_comp;
vc<int> dat; // par or (-size)
UnionFind(int n = 0) { build(n); }
void build(int m) {
n = m, n_comp = m;
dat.assign(n, -1);
}
void reset() { build(n); }
int operator[](int x) {
while (dat[x] >= 0) {
int pp = dat[dat[x]];
if (pp < 0) { return dat[x]; }
x = dat[x] = pp;
}
return x;
}
ll size(int x) {
x = (*this)[x];
return -dat[x];
}
bool merge(int x, int y) {
x = (*this)[x], y = (*this)[y];
if (x == y) return false;
if (-dat[x] < -dat[y]) swap(x, y);
dat[x] += dat[y], dat[y] = x, n_comp--;
return true;
}
vc<int> get_all() {
vc<int> A(n);
FOR(i, n) A[i] = (*this)[i];
return A;
}
};
#line 3 "/home/maspy/compro/library/graph/functional.hpp"
// N が根となる木を新たに作る
template <typename T = int>
struct FunctionalGraph {
int N, M;
vc<int> TO;
vc<T> wt;
vc<int> root;
Graph<T, 1> G;
FunctionalGraph() {}
FunctionalGraph(int N) : N(N), M(0), TO(N, -1), wt(N), root(N, -1) {}
void add(int a, int b, T c = 1) {
assert(0 <= a && a < N);
assert(TO[a] == -1);
++M;
TO[a] = b;
wt[a] = c;
}
pair<Graph<T, 1>, Tree<Graph<T, 1>>> build() {
assert(N == M);
UnionFind uf(N);
FOR(v, N) if (!uf.merge(v, TO[v])) { root[v] = v; }
FOR(v, N) if (root[v] == v) root[uf[v]] = v;
FOR(v, N) root[v] = root[uf[v]];
G.build(N + 1);
FOR(v, N) {
if (root[v] == v)
G.add(N, v, wt[v]);
else
G.add(TO[v], v, wt[v]);
}
G.build();
Tree<Graph<T, 1>> tree(G, N);
return {G, tree};
}
// a -> b にかかる回数. 不可能なら infty<int>. O(1).
template <typename TREE>
int dist(TREE& tree, int a, int b) {
if (tree.in_subtree(a, b)) return tree.depth[a] - tree.depth[b];
int r = root[a];
int btm = TO[r];
// a -> r -> btm -> b
if (tree.in_subtree(btm, b)) {
int x = tree.depth[a] - tree.depth[r];
x += 1;
x += tree.depth[btm] - tree.depth[b];
return x;
}
return infty<int>;
}
// functional graph に向かって進む
template <typename TREE>
int jump(TREE& tree, int v, ll step) {
int d = tree.depth[v];
if (step <= d - 1) return tree.jump(v, N, step);
v = root[v];
step -= d - 1;
int bottom = TO[v];
int c = tree.depth[bottom];
step %= c;
if (step == 0) return v;
return tree.jump(bottom, N, step - 1);
}
// functional graph に step 回進む
template <typename TREE>
vc<int> jump_all(TREE& tree, ll step) {
vc<int> res(N, -1);
// v の k 個先を res[w] に入れる
vvc<pair<int, int>> query(N);
FOR(v, N) {
int d = tree.depth[v];
int r = root[v];
if (d - 1 > step) { query[v].eb(v, step); }
if (d - 1 <= step) {
ll k = step - (d - 1);
int bottom = TO[r];
int c = tree.depth[bottom];
k %= c;
if (k == 0) {
res[v] = r;
continue;
}
query[bottom].eb(v, k - 1);
}
}
vc<int> path;
auto dfs = [&](auto& dfs, int v) -> void {
path.eb(v);
for (auto&& [w, k]: query[v]) { res[w] = path[len(path) - 1 - k]; }
for (auto&& e: G[v]) dfs(dfs, e.to);
path.pop_back();
};
for (auto&& e: G[N]) { dfs(dfs, e.to); }
return res;
}
template <typename TREE>
bool in_cycle(TREE& tree, int v) {
int r = root[v];
int bottom = TO[r];
return tree.in_subtree(bottom, v);
}
vc<int> collect_cycle(int r) {
assert(r == root[r]);
vc<int> cyc = {TO[r]};
while (cyc.back() != r) cyc.eb(TO[cyc.back()]);
return cyc;
}
// F^k(i)==F^k(j) となる最小の k OR -1
template <typename TREE>
int meet_time(TREE& tree, int i, int j) {
if (i == j) return 0;
if (root[i] != root[j]) return -1;
int r = root[i];
int b = TO[r];
int n = tree.depth[b] - tree.depth[r] + 1; // cyc len
if ((tree.depth[i] - tree.depth[j]) % n != 0) return -1;
if (tree.depth[i] == tree.depth[j]) {
int lca = tree.lca(i, j);
return tree.depth[i] - tree.depth[lca];
}
int ti = tree.depth[i] - tree.depth[tree.lca(b, i)];
int tj = tree.depth[j] - tree.depth[tree.lca(b, j)];
return max(ti, tj);
}
};
#line 7 "main.cpp"
int A[2000][2000];
int TO[2000][2000];
using Node = LCT_Node_Base;
void solve() {
INT(H, W);
auto idx = [&](int x, int y) -> int {
assert(0 <= x && x < H);
assert(0 <= y && y <= W);
return (W + 1) * x + y;
};
auto upd_to = [&](int x, int y) -> void {
int mx = -1;
int y1 = (y + 1) % W;
int ans = 0;
FOR(d, -1, 2) {
int x1 = (x + d + H) % H;
if (chmax(mx, A[x1][y1])) ans = x1;
}
TO[x][y] = ans;
};
FOR(x, H) FOR(y, W) { read(A[x][y]); }
int root = H * (W + 1);
Link_Cut_Tree<Node> LCT(root + 1);
FOR(x, H) FOR(y, W) {
upd_to(x, y);
int x1 = TO[x][y];
SHOW("link", idx(x, y), idx(x1, y + 1));
LCT.link(idx(x, y), idx(x1, y + 1));
}
FOR(x, H) {
SHOW("link", idx(x, W), root);
LCT.link(idx(x, W), root);
}
auto calc = [&](int x, int y, int k) -> pair<int, int> {
int n = min(W - y, k);
FOR(n) {
x = TO[x][y];
++y;
}
y %= W;
n = k - n;
if (n == 0) return {x, y};
assert(y == 0);
FunctionalGraph<int> FG(H);
FOR(x, H) {
int k = LCT.jump(root, idx(x, 0), 1);
auto [a, b] = divmod<int>(k, W + 1);
assert(b == W);
FG.add(x, a);
}
auto [G, tree] = FG.build();
auto [q, r] = divmod<int>(n, W);
x = FG.jump(tree, x, q);
FOR(r) { x = TO[x][y], ++y; }
return {x, y};
};
auto change = [&](int x, int y, int k) -> void {
vc<pair<int, int>> upd;
int py = (y + W - 1) % W;
FOR(d, -1, 2) {
int x1 = (x + d + H) % H;
SHOW("cut", idx(x1, py), idx(TO[x1][py], py + 1));
LCT.cut(idx(x1, py), idx(TO[x1][py], py + 1));
}
A[x][y] = k;
FOR(d, -1, 2) {
int x1 = (x + d + H) % H;
int x2 = TO[x1][py];
upd_to(x1, py);
LCT.link(idx(x1, py), idx(TO[x1][py], py + 1));
}
};
int x = 0, y = 0;
INT(Q);
FOR(Q) {
STR(S);
if (S == "move") {
INT(k);
tie(x, y) = calc(x, y, k);
print(1 + x, 1 + y);
}
if (S == "change") {
INT(x, y, k);
--x, --y;
change(x, y, k);
}
}
}
signed main() { solve(); }
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 5780kb
input:
4 4 1 2 9 3 3 5 4 8 4 3 2 7 5 8 1 6 4 move 1 move 1 change 1 4 100 move 1
output:
4 2 1 3 1 4
result:
ok 3 lines
Test #2:
score: 0
Accepted
time: 0ms
memory: 5692kb
input:
3 4 10 20 30 40 50 60 70 80 90 93 95 99 3 move 4 change 2 1 100 move 4
output:
3 1 2 1
result:
ok 2 lines
Test #3:
score: 0
Accepted
time: 3ms
memory: 5780kb
input:
20 30 8 1 7 4 3 1 2 1 5 5 2 7 6 4 7 1 2 9 1 9 9 9 9 6 4 9 1 6 3 10 7 3 5 6 5 3 5 3 1 9 8 8 7 7 6 7 5 10 9 6 5 3 8 2 7 10 6 8 4 3 6 4 3 1 7 7 6 7 2 7 3 6 8 6 3 2 7 8 10 8 6 5 6 10 2 6 5 10 10 9 2 5 10 9 4 9 3 6 10 8 1 7 3 3 7 3 3 6 7 5 1 1 10 6 8 5 4 2 1 8 5 1 2 8 3 4 2 4 4 9 6 3 1 5 9 1 9 3 8 3 7 10...
output:
19 10 18 19 3 24 3 30 3 2 4 3 3 8 7 14 3 21 2 27 3 7 3 8 6 16 5 17 3 24 2 27 3 29 3 8 7 12 6 16 3 22 3 2 7 12 3 19 1 22 4 25 4 3 3 5 7 12 3 20 1 22 2 24 3 2 6 11 3 20 2 24 4 4 3 5 5 10 6 11 4 18 2 21 3 29 3 2 3 5 4 9 6 16 2 25 1 26 2 1 4 6 7 15 2 24 3 2 7 12 3 19 3 28 5 4 9 11 9 12 11 17 10 19 12 21...
result:
ok 1945 lines
Test #4:
score: 0
Accepted
time: 10ms
memory: 8296kb
input:
50 50 126812431 909179109 607682292 96000160 425314080 189788877 721251789 103560861 114082307 888028612 277663589 257100764 842807257 327052508 652365304 770138116 384723035 680037089 675501229 509497026 174936063 991259231 761329528 658883078 806406343 741076652 973854314 192609094 398064987 65322...
output:
46 21 46 21 1 49 47 20 46 37 1 42 45 35 50 50 2 17 1 43 2 38 2 47 50 50 2 38 50 50 2 26 2 17 2 34 2 21 4 9 3 6 1 2 1 30 2 40 2 21 2 35 2 17 2 31 2 32 4 9 2 42 3 12 4 8 2 31 1 3 2 15 1 48 1 20 1 30 2 17 49 49 2 14 2 4 1 30 1 29 2 40 2 24 1 27 1 36 1 27 49 47 3 6 2 32 3 41 49 48 2 34 3 41 47 22 49 28 ...
result:
ok 502 lines
Test #5:
score: 0
Accepted
time: 11ms
memory: 8564kb
input:
100 191 178 164 436 292 160 15 447 40 415 308 107 456 61 483 370 222 49 178 96 272 359 232 285 356 320 316 56 450 34 30 300 15 53 269 210 271 443 169 387 273 181 175 38 177 167 447 376 252 434 97 334 389 349 216 293 265 227 273 171 351 68 481 430 249 482 117 206 429 359 61 431 207 163 336 329 490 20...
output:
94 140 94 149 98 91 98 19 97 121 94 169 3 51 98 97 1 37 1 37 3 61 97 10 98 13 93 179 95 146 97 8 97 130 96 6 95 158 98 122 94 181 94 140 97 117 94 176 96 133 100 38 99 29 1 68 3 59 3 46 97 124 93 155 95 139 94 143 10 10 13 63 7 184 8 164 13 62 12 57 15 41 10 10 12 84 8 2 11 89 11 119 12 92 7 166 9 7...
result:
ok 516 lines
Test #6:
score: 0
Accepted
time: 1779ms
memory: 189068kb
input:
1999 1971 274359794 615065638 314433231 715787778 486221282 877103113 462895814 602525302 496926569 16482389 7389157 94419868 841896951 423947821 735538885 670514061 398818169 503874450 256795479 71430930 757204344 924882965 721532878 511539013 917383058 160383266 270331386 296482213 104942177 30363...
output:
19 867 17 863 19 472 21 898 27 1104 29 1490 35 1470 28 64 21 24 34 1360 32 1384 10 756 17 915 30 1504 32 1398 22 16 35 1141 15 553 21 378 34 1168 18 455 16 515 33 1299 28 1556 34 1599 35 1443 9 685 32 1572 31 1205 22 386 26 1959 31 1200 20 817 30 1407 17 877 11 737 24 121 30 1546 25 156 10 997 18 44...
result:
ok 4951 lines
Test #7:
score: 0
Accepted
time: 305ms
memory: 189196kb
input:
1999 1972 908570368 576114585 871607413 105528864 717151909 868091308 442016015 96884299 951725816 178293034 660937316 882194661 290229206 116518447 685144293 777163613 825739358 379460279 316897433 343444500 220852674 464535570 629533274 19187139 768795424 839233681 621997087 563642576 573864427 21...
output:
11 50 30 1407 22 1111 23 1496 9 103 7 991 23 1154 1999 536 10 102 1998 414 30 1294 36 1388 19 3 1991 817 17 1891 26 1416 14 134 1991 649 1993 556 12 1559 22 1155 21 1107 1996 268 1996 269 1997 848 1990 611 1997 683 20 1157 11 50 1 251 12 151 14 135 18 1091 36 1358 1999 237 12 1555 8 918 18 1 19 1464...
result:
ok 55 lines
Test #8:
score: 0
Accepted
time: 1641ms
memory: 189052kb
input:
1999 1971 5 4 5 5 2 3 2 2 1 1 5 3 4 3 5 4 2 3 4 1 2 3 5 2 3 5 5 5 2 2 1 2 2 3 5 5 4 1 4 1 1 2 1 3 5 1 5 3 4 4 4 1 2 4 3 3 4 2 1 3 4 3 4 2 4 2 4 1 1 3 3 1 3 1 2 4 3 4 5 5 2 5 2 4 5 5 1 5 5 2 1 1 4 4 1 1 2 4 2 4 5 1 3 3 5 2 5 2 2 5 1 2 1 3 4 3 3 5 5 4 4 5 4 5 2 5 2 4 1 1 2 3 2 1 5 3 5 1 5 4 3 3 5 3 5 ...
output:
100 1816 98 151 84 910 92 271 101 1589 91 1067 96 1691 98 413 88 202 100 1658 88 1967 100 147 92 271 87 1293 84 1251 98 134 93 1929 97 294 99 454 99 118 85 1247 99 462 92 1764 86 1279 96 175 98 1688 88 1377 99 1533 97 375 92 1355 89 1023 94 159 92 1773 82 849 93 47 94 1846 99 1805 101 1660 84 1046 1...
result:
ok 4944 lines
Test #9:
score: 0
Accepted
time: 232ms
memory: 189084kb
input:
1999 1972 5 1 2 5 2 3 3 3 4 3 2 3 3 1 4 1 6 5 4 6 2 5 1 1 1 4 5 4 3 1 2 3 5 5 4 5 6 5 1 6 6 2 6 4 4 1 5 5 5 4 2 2 5 5 5 2 1 5 1 6 3 4 2 1 5 3 3 3 2 3 4 1 4 5 5 2 5 3 4 5 3 6 3 3 4 6 5 3 4 1 4 2 6 1 1 5 1 3 3 6 5 2 3 2 6 6 5 1 5 5 3 3 5 4 5 5 2 5 2 5 3 2 1 3 5 1 1 3 4 4 1 6 2 4 6 3 3 3 4 6 4 1 6 3 1 ...
output:
1926 1347 1944 1057 1940 710 1930 1764 1943 42 1931 563 1942 1917 1926 410 1942 1053 1932 1122 1928 335 1940 705 1917 462 1923 371 1922 524 1926 1246 1939 842 1933 940 1932 656 1923 1320 1926 583 1926 1219 1937 1827 1921 1646 1935 13 1941 1070 1941 822 1929 1160 1936 1809 1919 241 1927 387 1933 671 ...
result:
ok 51 lines
Test #10:
score: 0
Accepted
time: 904ms
memory: 191504kb
input:
2000 1999 6 6 4 5 4 2 3 1 1 2 5 1 1 2 6 3 1 5 5 4 5 2 4 1 6 6 1 4 2 3 5 6 1 4 6 4 4 3 4 3 6 3 2 4 3 2 1 3 1 2 6 2 6 1 5 4 4 2 5 6 2 3 2 1 3 3 4 3 6 4 1 2 1 4 1 1 1 6 6 3 5 4 4 2 2 3 3 4 2 4 4 4 3 6 6 6 2 6 3 3 6 2 4 5 2 1 5 6 6 3 1 3 4 6 4 4 1 3 5 4 1 6 6 6 6 5 2 5 1 3 2 3 4 1 4 6 5 2 6 6 5 1 5 3 6 ...
output:
1996 429 7 1375 1990 162 2000 1918 1 499 7 1392 1999 1605 3 1859 1992 690 3 1531 1985 101 9 1290 2000 1511 6 1819 1 1540 8 1811 8 1067 1 918 1993 166 2000 1519 11 1081 1996 173 7 1392 1979 129 11 1091 1999 1958 1994 214 8 1483 1997 399 1997 1708 1992 1634 2000 930 3 1172 2000 1195 2 339 1985 97 2000...
result:
ok 2513 lines
Test #11:
score: 0
Accepted
time: 1031ms
memory: 191416kb
input:
1998 2000 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ...
output:
1195 381 979 1816 1732 485 772 1313 1435 1068 1561 1753 1726 696 1915 1877 1993 837 916 1404 1240 403 1633 514 379 723 1588 1116 1762 365 1621 105 1372 1847 679 1301 1270 408 1504 1197 1033 1496 268 267 1033 743 1612 1198 1849 1420 445 80 1495 1613 1135 1082 1633 1309 1507 1479 1261 776 1324 772 198...
result:
ok 3332 lines
Test #12:
score: 0
Accepted
time: 565ms
memory: 191276kb
input:
1998 2000 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ...
output:
829 1918 541 712 22 1294 1246 527 1918 1368 145 218 1855 1421 616 1809 472 971 1588 923 982 1033 1330 1786 1630 187 637 27 1945 457 1393 1132 397 219 724 1984 1318 337 1231 1954 1156 981 1840 24 532 1075 1303 984 709 45 571 1166 82 1101 271 1384 97 1470 1492 1186 1405 917 931 1108 1357 2 124 1406 16...
result:
ok 1666 lines
Test #13:
score: 0
Accepted
time: 0ms
memory: 5708kb
input:
3 30 2 3 5 4 1 3 4 3 5 1 1 2 4 3 4 5 1 3 2 3 1 3 3 3 2 5 1 3 3 2 5 5 4 5 5 2 1 1 3 5 4 4 2 2 5 1 5 5 3 1 4 5 2 4 3 1 5 1 5 3 4 4 3 3 3 5 3 5 1 3 2 1 5 1 3 4 4 4 4 4 3 1 1 5 5 2 2 5 2 1 5000 change 3 3 1 move 952187187 change 1 27 1 move 974680939 change 3 13 1 change 2 5 2 move 920255431 change 2 20...
output:
3 28 2 17 2 18 1 23 2 24 2 22 2 30 2 4 1 7 2 29 2 29 2 17 2 17 1 9 1 7 3 5 1 3 3 14 2 1 1 16 2 30 1 9 3 6 2 21 3 23 3 21 1 16 3 5 1 13 2 29 1 26 2 4 3 5 3 8 1 16 3 6 1 10 3 30 2 11 2 12 1 26 2 22 1 10 1 9 1 10 3 15 3 1 1 7 3 23 2 29 2 2 2 5 3 15 3 12 3 20 1 11 2 22 3 10 3 3 3 5 3 20 1 24 3 5 1 24 3 ...
result:
ok 1935 lines
Test #14:
score: 0
Accepted
time: 5ms
memory: 5872kb
input:
4 4 4 2 3 1 2 5 5 2 3 1 2 4 1 4 1 3 5000 change 1 1 5 move 973774583 change 2 1 2 move 907682990 change 3 2 3 move 967713529 change 1 3 4 move 957932232 change 3 1 3 change 2 3 3 move 903397861 move 976938118 change 3 1 4 move 981043236 move 979560517 change 2 1 2 change 2 2 1 change 3 1 4 change 3 ...
output:
3 4 2 2 2 3 2 3 4 4 2 2 2 2 1 3 1 1 1 3 1 3 4 4 4 2 1 4 1 4 1 4 1 4 1 1 1 4 1 3 1 1 4 2 1 4 1 1 1 1 4 2 1 1 1 3 3 4 4 1 3 3 3 4 1 1 1 4 1 4 1 4 1 1 1 4 2 2 1 1 2 3 2 3 1 1 1 1 1 1 2 2 2 2 2 2 3 1 3 3 3 3 2 2 3 3 2 2 2 2 1 3 3 1 3 1 1 3 3 1 3 1 1 3 1 4 1 3 1 2 1 4 1 4 1 4 1 3 2 3 1 4 2 4 3 1 3 3 3 3 ...
result:
ok 2027 lines
Test #15:
score: 0
Accepted
time: 1630ms
memory: 191528kb
input:
2000 1999 2009 2008 2007 2006 2005 2004 2003 2002 2001 2000 1999 1998 1997 1996 1995 1994 1993 1992 1991 1990 1989 1988 1987 1986 1985 1984 1983 1982 1981 1980 1979 1978 1977 1976 1975 1974 1973 1972 1971 1970 1969 1968 1967 1966 1965 1964 1963 1962 1961 1960 1959 1958 1957 1956 1955 1954 1953 1952 ...
output:
1884 106 1261 1509 1418 1024 1167 78 1203 1697 1251 843 1605 1894 1191 687 1801 1010 1451 711 530 1846 1906 1363 1611 655 759 342 1779 589 348 73 1347 1297 85 671 1927 1237 725 68 181 308 624 418 219 1555 108 689 1234 1365 1308 1642 298 1632 248 64 1631 454 1348 133 1945 1546 1945 734 1079 879 1313 ...
result:
ok 2500 lines
Test #16:
score: 0
Accepted
time: 545ms
memory: 191332kb
input:
2000 1999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...
output:
999 1734 999 1990 999 1343 999 1784 999 258 999 629 999 1611 999 1416 999 346 999 1686 999 747 999 1072 999 795 999 1160 999 1648 999 1484 1002 1030 1002 271 1002 768 1002 605 999 1118 999 1399 999 693 999 906 1002 93 1002 1998 1002 388 1002 1220 999 1139 999 861 999 215 999 832 1002 479 1002 915 99...
result:
ok 1666 lines
Test #17:
score: 0
Accepted
time: 568ms
memory: 191360kb
input:
2000 1999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...
output:
999 872 999 1042 999 1097 999 425 999 138 999 1763 999 1201 999 757 999 1317 999 1177 1002 354 1002 1867 999 129 999 1612 1002 577 1002 322 999 104 999 41 999 60 999 1374 1002 132 1002 1850 999 1686 999 160 1002 1022 1002 1734 1002 431 1002 1120 999 501 999 754 999 1974 999 1047 999 1870 999 1805 99...
result:
ok 1666 lines
Test #18:
score: 0
Accepted
time: 561ms
memory: 191444kb
input:
2000 1999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...
output:
1002 267 1002 1810 1002 1923 1002 29 1002 1868 1002 974 1002 133 1002 285 999 460 999 44 1002 314 1002 1883 1002 213 1002 33 1002 1070 1002 488 1002 77 1002 1453 1002 87 1002 1575 999 1506 999 226 1002 1170 1002 957 1002 1454 1002 207 999 1427 999 40 999 430 999 1326 1002 1220 1002 493 1002 1282 100...
result:
ok 1666 lines
Test #19:
score: 0
Accepted
time: 380ms
memory: 191096kb
input:
1998 2000 5999 6001 6003 6005 6007 6009 6011 6013 6015 6017 6019 6021 6023 6025 6027 6029 6031 6033 6035 6037 6039 6041 6043 6045 6047 6049 6051 6053 6055 6057 6059 6061 6063 6065 6067 6069 6071 6073 6075 6077 6079 6081 6083 6085 6087 6089 6091 6093 6095 6097 6099 6101 6103 6105 6107 6109 6111 6113 ...
output:
1936 61 1488 1488 353 351 767 765 724 722 281 1719 809 807 486 484 81 1919 208 206 1061 936 1692 305 1542 455 351 1649 686 684 411 1589 1773 1773 1273 1273 781 779 1795 202 192 1808 689 687 1424 1424 1461 1461 932 930 136 1864 1969 28 1124 1124 785 1215 442 1558 1226 1226 789 1211 1561 436 1476 521 ...
result:
ok 527 lines
Test #20:
score: 0
Accepted
time: 396ms
memory: 191224kb
input:
1998 2000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...
output:
1361 61 1209 1488 349 351 67 765 24 722 981 1719 109 807 216 484 781 1919 494 206 1761 936 1605 305 1755 455 951 1649 16 684 891 1589 1073 1773 1424 1273 81 779 1502 202 892 1808 13 687 1273 1424 1236 1461 232 930 836 1864 1328 28 1573 1124 517 1215 860 1558 1471 1226 513 1211 1736 436 1821 521 553 ...
result:
ok 527 lines
Test #21:
score: 0
Accepted
time: 385ms
memory: 191248kb
input:
1998 2000 7199 7201 7203 7205 7207 7209 7211 7213 7215 7217 7219 7221 7223 7225 7227 7229 7231 7233 7235 7237 7239 7241 7243 7245 7247 7249 7251 7253 7255 7257 7259 7261 7263 7265 7267 7269 7271 7273 7275 7277 7279 7281 7283 7285 7287 7289 7291 7293 7295 7297 7299 7301 7303 7305 7307 7309 7311 7313 ...
output:
1336 61 1909 1488 953 351 635 765 678 722 321 1719 593 807 916 484 521 1919 808 206 1536 936 1092 305 1055 455 251 1649 716 684 191 1589 1624 1773 1873 1273 621 779 1195 202 410 1808 713 687 1973 1424 1936 1461 470 930 466 1864 1369 28 1724 1124 185 1215 160 1558 1826 1226 189 1211 1036 436 1121 521...
result:
ok 527 lines