Submission #51046291


Source Code Expand

#pragma region template

#include <bits/stdc++.h>
using namespace std;
#include <atcoder/all>
using namespace atcoder;

const long long INF = 1001001001;
const long long INFL = 1001001001001001001;
const double MYPI = 3.14159265358979;
const double epsilon = 1e-10;

using mint = modint1000000007;
using mint1 = modint998244353;

typedef long long ll;
typedef __int128_t lll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<ll, ll> pl;
typedef vector<ll> vl;
typedef vector<vl> vvl;
typedef vector<vvl> vvvl;
typedef vector<double> vd;
typedef vector<vd> vvd;
typedef vector<vvd> vvvd;
typedef vector<mint> vm;
typedef vector<vm> vvm;
typedef vector<vvm> vvvm;
typedef vector<mint1> vm1;
typedef vector<vm1> vvm1;
typedef vector<vvm1> vvvm1;
typedef vector<modint> vm2;
typedef vector<vm2> vvm2;
typedef vector<vvm2> vvvm2;
typedef vector<bool> vb;
typedef vector<vb> vvb;
typedef vector<vvb> vvvb;
typedef vector<char> vc;
typedef vector<vc> vvc;
typedef vector<vvc> vvvc;
typedef vector<pl> vp;
typedef tuple<ll, ll, ll> tt;
typedef vector<tuple<ll, ll, ll>> vt;
typedef vector<string> vs;

#define overload3(a, b, c, d, ...) d
#define overload4(a, b, c, d, e, ...) e
#define overload5(a, b, c, d, e, f, ...) f
#define overload6(a, b, c, d, e, f, g, ...) g
#define pb push_back
#define eb emplace_back
#define MP make_pair
#define REP0(n) for (int _ = 0; _ < (n); _++)
#define REP1(i, n) for (int i = 0; i < (n); i++)
#define REP2(i, l, r) for (int i = (l); i < (r); i++)
#define REP3(i, l, r, d) for (int i = (l); i < (r); i += (d))
#define REP(...) overload4(__VA_ARGS__, REP3, REP2, REP1, REP0)(__VA_ARGS__)
#define REPP(i, n) for (int i = 1; i <= (n); i++)
#define RREP1(i, n) for (int i = (n)-1; i >= 0; i--)
#define RREP2(i, l, r) for (int i = (r)-1; i >= (l); i--)
#define RREP3(i, l, r, d) for (int i = (r)-1; i >= (l); i -= (d))
#define RREP(...) overload4(__VA_ARGS__, RREP3, RREP2, RREP1)(__VA_ARGS__)
#define RREPP(i, n) for (int i = (n); i > 0; i--)
#define EACH1(e, a) for (auto &e : a)
#define EACH2(x, y, a) for (auto &[x, y] : a)
#define EACH3(x, y, z, a) for (auto &[x, y, z] : a)
#define EACH(...) overload4(__VA_ARGS__, EACH3, EACH2, EACH1)(__VA_ARGS__)
#define ALL1(x) begin(x), end(x)
#define ALL2(x, a) begin(x), begin(x) + a
#define ALL3(x, a, b) begin(x) + a, begin(x) + b
#define ALL(...) overload3(__VA_ARGS__, ALL3, ALL2, ALL1)(__VA_ARGS__)
#define RALL1(i) (i).rbegin(), (i).rend()
#define RALL2(i, a) (i).rend() - a, (i).rend()
#define RALL3(i, a, b) (i).rend() - b, (i).rend() - a
#define RALL(...) overload3(__VA_ARGS__, RALL3, RALL2, RALL1)(__VA_ARGS__)
#define sz(x) (int)x.size()
#define LB(a, x) (lower_bound(a.begin(), a.end(), x) - a.begin())
#define UB(a, x) (upper_bound(a.begin(), a.end(), x) - a.begin())
#define FLG(x, i) (((x) >> (i)) & 1)
#define CNTBIT(x) __builtin_popcountll(x)
#define TOPBIT(t) (t == 0 ? -1 : 63 - __builtin_clzll(t))
#define BTMBIT(t) (t == 0 ? 64 : __builtin_ctzll(t))
#define IN(x, a, b) ((a) <= (x) && (x) < (b))
#define INT(...)                                                               \
    int __VA_ARGS__;                                                           \
    input(__VA_ARGS__)
#define STR(...)                                                               \
    string __VA_ARGS__;                                                        \
    input(__VA_ARGS__)
#define CHAR(...)                                                              \
    char __VA_ARGS__;                                                          \
    input(__VA_ARGS__)
#define DBL(...)                                                               \
    double __VA_ARGS__;                                                        \
    input(__VA_ARGS__)
#define LD(...)                                                                \
    long double __VA_ARGS__;                                                   \
    input(__VA_ARGS__)
#define VL1(a, n)                                                              \
    vector<long long> a(n);                                                    \
    for (int I = 0; I < (n); I++)                                              \
    cin >> a[I]
#define VL2(a, b, n)                                                           \
    vector<long long> a(n), b(n);                                              \
    for (int I = 0; I < (n); I++)                                              \
    cin >> a[I] >> b[I]
#define VL3(a, b, c, n)                                                        \
    vector<long long> a(n), b(n), c(n);                                        \
    for (int I = 0; I < (n); I++)                                              \
    cin >> a[I] >> b[I] >> c[I]
#define VL4(a, b, c, d, n)                                                     \
    vector<long long> a(n), b(n), c(n), d(n);                                  \
    for (int I = 0; I < (n); I++)                                              \
    cin >> a[I] >> b[I] >> c[I] >> d[I]
#define VL5(a, b, c, d, e, n)                                                  \
    vector<long long> a(n), b(n), c(n), d(n), e(n);                            \
    for (int I = 0; I < (n); I++)                                              \
    cin >> a[I] >> b[I] >> c[I] >> d[I] >> e[I]
#define VL(...) overload6(__VA_ARGS__, VL5, VL4, VL3, VL2, VL1)(__VA_ARGS__)
#define VD1(a, n)                                                              \
    vector<double> a(n);                                                       \
    for (int I = 0; I < (n); I++)                                              \
    cin >> a[I]
#define VD2(a, b, n)                                                           \
    vector<double> a(n), b(n);                                                 \
    for (int I = 0; I < (n); I++)                                              \
    cin >> a[I] >> b[I]
#define VD3(a, b, c, n)                                                        \
    vector<double> a(n), b(n), c(n);                                           \
    for (int I = 0; I < (n); I++)                                              \
    cin >> a[I] >> b[I] >> c[I]
#define VD4(a, b, c, d, n)                                                     \
    vector<double> a(n), b(n), c(n), d(n);                                     \
    for (int I = 0; I < (n); I++)                                              \
    cin >> a[I] >> b[I] >> c[I] >> d[I]
#define VD5(a, b, c, d, e, n)                                                  \
    vector<double> a(n), b(n), c(n), d(n), e(n);                               \
    for (int I = 0; I < (n); I++)                                              \
    cin >> a[I] >> b[I] >> c[I] >> d[I] >> e[I]
#define VD(...) overload6(__VA_ARGS__, VD5, VD4, VD3, VD2, VD1)(__VA_ARGS__)
#define VVL(a, n, m)                                                           \
    vector<vector<long long>> a(n, vector<long long>(m));                      \
    for (int I = 0; I < (n); I++)                                              \
        for (int J = 0; J < (m); J++)                                          \
    cin >> a[I][J]
#define VVC(s, n, m)                                                           \
    vector<vector<char>> s(n, vector<char>(m));                                \
    for (int I = 0; I < (n); I++)                                              \
        for (int J = 0; J < (m); J++)                                          \
    cin >> s[I][J]
#define VS(s, n)                                                               \
    vector<string> s(n);                                                       \
    for (int I = 0; I < (n); I++)                                              \
        cin >> s[I];

ostream &operator<<(ostream &os, const modint &a) { return os << a.val(); }
ostream &operator<<(ostream &os, const modint1000000007 &a) {
    return os << a.val();
}
ostream &operator<<(ostream &os, const modint998244353 &a) {
    return os << a.val();
}
template <typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &a) {
    return os << a.first << " " << a.second;
}
template <typename T1, typename T2, typename T3>
ostream &operator<<(ostream &os, const tuple<T1, T2, T3> &a) {
    return os << get<0>(a) << " " << get<1>(a) << " " << get<2>(a);
}

struct IoSetup {
    IoSetup() {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cout << fixed << setprecision(15);
    }
} iosetup;

#ifdef LOCAL
#include <debug_print.hpp>
#define debug(...) debug_print::multi_print(#__VA_ARGS__, __VA_ARGS__)
#else
#define debug(...) (static_cast<void>(0))
#endif

template <typename T> using minheap = priority_queue<T, vector<T>, greater<T>>;

template <typename T> using maxheap = priority_queue<T>;

template <class... T> void input(T &...a) { (cin >> ... >> a); }

template <typename... T> constexpr auto min(T... a) {
    return min(initializer_list<common_type_t<T...>>{a...});
}
template <typename... T> constexpr auto max(T... a) {
    return max(initializer_list<common_type_t<T...>>{a...});
}

template <typename T1, typename T2> bool chmax(T1 &x, const T2 &y) {
    return x < y ? x = y, true : false;
}
template <typename T1, typename T2> bool chmin(T1 &x, const T2 &y) {
    return x > y ? x = y, true : false;
}

void OUT() { cout << '\n'; }

template <typename T, typename... Ts> void OUT(const T &a, const Ts &...b) {
    cout << a;
    (cout << ... << (cout << " ", b));
    cout << '\n';
}

template <typename T> void OUT(const vector<T> &res) {
    for (int i = 0; i < (int)res.size(); i++) {
        cout << res[i] << " ";
    }
    cout << '\n';
}

template <typename T> void OUT_(const T &a) { cout << a << " "; }

template <typename T> void OUTN(const vector<T> &res, long long margin = 0) {
    for (int i = 0; i < (int)res.size(); i++) {
        cout << res[i] + (T)margin << '\n';
    }
}

template <typename T> void OUTN_(const vector<T> &res, long long margin = 0) {
    for (int i = 0; i < (int)res.size(); i++) {
        cout << res[i] + (T)margin << " ";
    }
    cout << '\n';
}

template <typename T>
void OUTNN(const vector<vector<T>> &res, long long margin = 0) {
    for (int i = 0; i < (int)res.size(); i++) {
        for (int j = 0; j < (int)res[i].size(); j++) {
            cout << res[i][j] + (T)margin << " ";
        }
        cout << '\n';
    }
}

void YES(const bool &res = true, bool Capital = false) {
    if (Capital)
        cout << (res ? "YES" : "NO") << '\n';
    else
        cout << (res ? "Yes" : "No") << '\n';
}

void FIRST(const bool &res = true, bool Capital = false) {
    if (Capital)
        cout << (res ? "FIRST" : "SECOND") << '\n';
    else
        cout << (res ? "First" : "Second") << '\n';
}

template <typename T> void DEC(vector<T> &a, long long dif = 1) {
    for (auto &x : a)
        x -= (T)dif;
}
template <typename T> void DEC(vector<T> &a, vector<T> &b, long long dif = 1) {
    for (auto &x : a)
        x -= (T)dif;
    for (auto &x : b)
        x -= (T)dif;
}
template <typename T> void DEC(vector<vector<T>> &a, long long dif = 1) {
    for (auto &v : a)
        for (auto &x : v)
            x -= (T)dif;
}

template <typename T> void INC(vector<T> &a, long long dif = 1) {
    for (auto &x : a)
        x += (T)dif;
}
template <typename T> void INC(vector<T> &a, vector<T> &b, long long dif = 1) {
    for (auto &x : a)
        x += (T)dif;
    for (auto &x : b)
        x += (T)dif;
}
template <typename T> void INC(vector<vector<T>> &a, long long dif = 1) {
    for (auto &v : a)
        for (auto &x : v)
            x += (T)dif;
}

template <typename T> T SUM(const vector<T> &a) {
    return accumulate(a.begin(), a.end(), (T)0);
}
template <typename T> T SUM(const vector<vector<T>> &a) {
    T ret = 0;
    for (int i = 0; i < (int)a.size(); i++)
        ret += accumulate(a[i].begin(), a[i].end(), (T)0);
    return ret;
}

template <typename T> T MAX(const vector<T> &a) {
    return *max_element(a.begin(), a.end());
}
template <typename T> T MAX(const vector<vector<T>> &a) {
    T ret = -INFL;
    for (int i = 0; i < (int)a.size(); i++)
        for (int j = 0; j < (int)a[i].size(); j++)
            if (ret < a[i][j])
                ret = a[i][j];
    return ret;
}

template <typename T> int ARGMAX(const vector<T> &a) {
    int ret = 0;
    for (int i = 1; i < (int)a.size(); i++)
        if (a[ret] < a[i])
            ret = i;
    return ret;
}
template <typename T> pair<int, int> ARGMAX(const vector<vector<T>> &a) {
    pair<int, int> ret = {0, 0};
    for (int i = 0; i < (int)a.size(); i++)
        for (int j = 0; j < (int)a[i].size(); j++)
            if (a[ret.first][ret.second] < a[i][j])
                ret = {i, j};
    return ret;
}

template <typename T> T MIN(const vector<T> &a) {
    return *min_element(a.begin(), a.end());
}
template <typename T> T MIN(const vector<vector<T>> &a) {
    T ret = INFL;
    for (int i = 0; i < (int)a.size(); i++)
        for (int j = 0; j < (int)a[i].size(); j++)
            if (ret > a[i][j])
                ret = a[i][j];
    return ret;
}

template <typename T> int ARGMIN(const vector<T> &a) {
    int ret = 0;
    for (int i = 1; i < (int)a.size(); i++)
        if (a[ret] > a[i])
            ret = i;
    return ret;
}
template <typename T> pair<int, int> ARGMIN(const vector<vector<T>> &a) {
    pair<int, int> ret = {0, 0};
    for (int i = 0; i < (int)a.size(); i++)
        for (int j = 0; j < (int)a[i].size(); j++)
            if (a[ret.first][ret.second] > a[i][j])
                ret = {i, j};
    return ret;
}

template <typename T> int SIGN(const T &a) {
    if (abs(a) < epsilon)
        return 0;
    return a > 0 ? 1 : -1;
}

template <typename T> vector<T> UNIQ(vector<T> a) {
    sort(a.begin(), a.end());
    a.erase(unique(a.begin(), a.end()), a.end());
    return a;
}

template <typename T> vector<T> sorted(vector<T> a, bool Descending = false) {
    sort(a.begin(), a.end());
    if (Descending)
        reverse(a.begin(), a.end());
    return a;
}

template <typename T> vector<T> cumsum(const vector<T> &a) {
    int n = (int)a.size();
    vector<T> ret(n + 1, (T)0);
    for (int i = 0; i < n; i++)
        ret[i + 1] = ret[i] + a[i];
    return ret;
}
template <typename T> vector<vector<T>> cumsum(const vector<vector<T>> &a) {
    int n = (int)a.size(), m = (int)a[0].size();
    vector<vector<T>> ret(n + 1, vector<T>(m + 1, (T)0));
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            ret[i + 1][j + 1] = ret[i + 1][j] + a[i][j];
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            ret[i + 1][j + 1] += ret[i][j + 1];
    return ret;
}
template <typename T>
vector<vector<vector<T>>> cumsum(const vector<vector<vector<T>>> &a) {
    int n = (int)a.size(), m = (int)a[0].size(), l = (int)a[0][0].size();
    vector<vector<vector<T>>> ret(
        n + 1, vector<vector<T>>(m + 1, vector<T>(l + 1, (T)0)));
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            for (int k = 0; k < l; k++)
                ret[i + 1][j + 1][k + 1] = ret[i + 1][j + 1][k] + a[i][j][k];
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            for (int k = 0; k < l; k++)
                ret[i + 1][j + 1][k + 1] += ret[i][j + 1][k + 1];
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            for (int k = 0; k < l; k++)
                ret[i + 1][j + 1][k + 1] += ret[i + 1][j][k + 1];
    return ret;
}
template <typename T> void cumsum_inplace(vector<T> &a) {
    int n = (int)a.size();
    for (int i = 0; i < n - 1; i++)
        a[i + 1] += a[i];
}
template <typename T> void cumsum_inplace(vector<vector<T>> &a) {
    int n = (int)a.size(), m = (int)a[0].size();
    for (int i = 0; i < n - 1; i++)
        for (int j = 0; j < m; j++)
            a[i + 1][j] += a[i][j];
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m - 1; j++)
            a[i][j + 1] += a[i][j];
}
template <typename T> void cumsum_inplace(vector<vector<vector<T>>> &a) {
    int n = (int)a.size(), m = (int)a[0].size(), l = (int)a[0][0].size();
    for (int i = 0; i < n - 1; i++)
        for (int j = 0; j < m; j++)
            for (int k = 0; k < l; k++)
                a[i + 1][j][k] += a[i][j][k];
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m - 1; j++)
            for (int k = 0; k < l; k++)
                a[i][j + 1][k] += a[i][j][k];
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            for (int k = 0; k < l - 1; k++)
                a[i][j][k + 1] += a[i][j][k];
}

template <typename T = long long> struct Edge {
    int from, to;
    T cost;
    int idx;
    Edge() = default;
    Edge(int from, int to, T cost = 1, int idx = -1)
        : from(from), to(to), cost(cost), idx(idx) {}
    operator int() const { return to; }
};

template <typename T = long long> struct Graph {
    vector<vector<Edge<T>>> g;
    int es;
    Graph() = default;
    explicit Graph(int n) : g(n), es(0) {}
    size_t size() const { return g.size(); }
    void add_directed_edge(int from, int to, T cost = 1) {
        g[from].emplace_back(from, to, cost, es++);
    }
    void add_edge(int from, int to, T cost = 1) {
        g[from].emplace_back(from, to, cost, es);
        g[to].emplace_back(to, from, cost, es++);
    }
    inline vector<Edge<T>> &operator[](const int &k) { return g[k]; }
    inline const vector<Edge<T>> &operator[](const int &k) const {
        return g[k];
    }
};

template <typename T = long long> using Edges = vector<Edge<T>>;

template <typename T> struct Enumeration {
  private:
    static vector<T> _fact, _finv, _inv;
    inline static void expand(size_t sz) {
        if (_fact.size() < sz + 1) {
            int pre_sz = max(1, (int)_fact.size());
            _fact.resize(sz + 1, T(1));
            _finv.resize(sz + 1, T(1));
            _inv.resize(sz + 1, T(1));
            for (int i = pre_sz; i <= (int)sz; i++) {
                _fact[i] = _fact[i - 1] * T(i);
            }
            _finv[sz] = T(1) / _fact[sz];
            for (int i = (int)sz - 1; i >= pre_sz; i--) {
                _finv[i] = _finv[i + 1] * T(i + 1);
            }
            for (int i = pre_sz; i <= (int)sz; i++) {
                _inv[i] = _finv[i] * _fact[i - 1];
            }
        }
    }

  public:
    explicit Enumeration(size_t sz = 0) { expand(sz); }
    static inline T fact(int k) {
        expand(k);
        return _fact[k];
    }
    static inline T finv(int k) {
        expand(k);
        return _finv[k];
    }
    static inline T inv(int k) {
        expand(k);
        return _inv[k];
    }
    static T P(int n, int r) {
        if (r < 0 || n < r)
            return 0;
        return fact(n) * finv(n - r);
    }
    static T C(int p, int q) {
        if (q < 0 || p < q)
            return 0;
        return fact(p) * finv(q) * finv(p - q);
    }
};

template <typename T> vector<T> Enumeration<T>::_fact = vector<T>();
template <typename T> vector<T> Enumeration<T>::_finv = vector<T>();
template <typename T> vector<T> Enumeration<T>::_inv = vector<T>();

template <typename T>
T norm1(const pair<T, T> &a, const pair<T, T> &b = {(T)0, (T)0}) {
    return abs(a.first - b.first) + abs(a.second - b.second);
}
template <typename T>
T norm22(const pair<T, T> &a, const pair<T, T> &b = {(T)0, (T)0}) {
    return (a.first - b.first) * (a.first - b.first) +
           (a.second - b.second) * (a.second - b.second);
}
template <typename T>
double norm2(const pair<T, T> &a, const pair<T, T> &b = {(T)0, (T)0}) {
    return sqrt(norm22(a, b));
}

long long powll(long long a, long long n) {
    assert(n >= 0);
    if (n == 0)
        return 1;
    long long ret = 1;
    while (n) {
        if (n & 1)
            ret *= a;
        a *= a;
        n >>= 1;
    }
    return ret;
}

vector<int> str_to_vl(const string &s) {
    vector<int> ret(s.size());
    if (s.size() == 0)
        return ret;
    if (0 <= s[0] - 'A' && s[0] - 'A' < 26)
        for (int i = 0; i < (int)s.size(); i++)
            ret[i] = s[i] - 'A';
    else if (0 <= s[0] - 'a' && s[0] - 'a' < 26)
        for (int i = 0; i < (int)s.size(); i++)
            ret[i] = s[i] - 'a';
    else if (0 <= s[0] - '0' && s[0] - '0' < 10)
        for (int i = 0; i < (int)s.size(); i++)
            ret[i] = s[i] - '0';
    else
        assert(0);
    return ret;
}

// 0-indexed
int TOPDIGIT(long long x) {
    assert(x >= 0);
    int ret = 0;
    while (x >= 10) {
        x /= 10;
        ret++;
    }
    return ret;
}

template <typename T> vector<pair<T, int>> sorti(const vector<T> &a) {
    vector<pair<T, int>> ret(a.size());
    for (int i = 0; i < (int)a.size(); i++) {
        ret[i] = {a[i], i};
    }
    sort(ret.begin(), ret.end());
    return ret;
}
template <typename T1, typename T2>
vector<tuple<T1, T2, int>> sorti(const vector<T1> &a, const vector<T2> &b) {
    assert(a.size() == b.size());
    vector<tuple<T1, T2, int>> ret(a.size());
    for (int i = 0; i < (int)a.size(); i++) {
        ret[i] = {a[i], b[i], i};
    }
    sort(ret.begin(), ret.end());
    return ret;
}
template <typename T1, typename T2, typename T3>
vector<tuple<T1, T2, T3, int>> sorti(const vector<T1> &a, const vector<T2> &b,
                                     const vector<T3> &c) {
    assert(a.size() == b.size() && a.size() == c.size());
    vector<tuple<T1, T2, T3, int>> ret(a.size());
    for (int i = 0; i < (int)a.size(); i++) {
        ret[i] = {a[i], b[i], c[i], i};
    }
    sort(ret.begin(), ret.end());
    return ret;
}

// 高々小数第 k 位までの実数を 10^k 倍して整数化
ll decimal_to_ll(const string &s, int k) {
    int n = s.size();
    for (int i = 0; i < n; i++) {
        if (s[i] == '.') {
            ll ret = stoll(s.substr(0, i) + s.substr(i + 1));
            for (int j = 0; j < k - (n - 1 - i); j++)
                ret *= 10;
            return ret;
        }
    }
    ll ret = stoll(s);
    for (int i = 0; i < k; i++)
        ret *= 10;
    return ret;
}

template <typename F>
long long bisect_ll(const F &is_ok, long long ok, long long ng) {
    // while(!is_ok(ok)){
    //     ok <<= 1;
    // 	assert(ok < (1LL << 62));
    // }
    while (abs(ok - ng) > 1) {
        long long mid = (ok + ng) / 2;
        is_ok(mid) ? ok = mid : ng = mid;
    }
    return ok;
}

template <typename F>
double bisect_double(const F &is_ok, double ok, double ng) {
    // while(!is_ok(ok)){
    //     ok *= 2;
    //     assert(ok < (1LL << 62));
    // }
    while (abs(ok - ng) > epsilon) {
        double mid = (ok + ng) / 2;
        is_ok(mid) ? ok = mid : ng = mid;
    }
    return ok;
}

long long max(const int &a, const long long &b) { return max((long long)a, b); }
long long min(const int &a, const long long &b) { return min((long long)a, b); }

const vector<int> dy = {1, 0, -1, 0, 1, 1, -1, -1};
const vector<int> dx = {0, 1, 0, -1, -1, 1, 1, -1};

random_device seed_gen;
mt19937_64 rnd;

// [low, high] の範囲の値を持つ長さ len のランダムベクトルを生成
vector<long long> random_vl(int len, long long low, long long high) {
    uniform_int_distribution<long long> dist(low, high);
    vector<long long> ret(len);
    for (int i = 0; i < len; i++)
        ret[i] = dist(rnd);
    return ret;
};

vector<int> random_permutation(int len) {
    uniform_int_distribution<int> dist(1, len);
    vector<int> ret(len);
    set<int> se;
    for (int i = 0; i < len; i++) {
        int tmp = dist(rnd);
        while (se.count(tmp))
            tmp = dist(rnd);
        ret[i] = tmp;
        se.insert(ret[i]);
    }
    return ret;
};

#pragma endregion template

//----------------------------- コピペゾーン ---------------------------------

//----------------------------------------------------------------------------

#define int long long

struct Solver {
    void solve() {
        // Write here.
        INT(n);
        VL(a, n);
        INT(m);
        VL(b, m);
        INT(l);
        VL(c, l);
        set<ll> se;
        REP(i, n)REP(j, m)REP(k, l)se.insert(a[i] + b[j] + c[k]);
        INT(q);
        VL(x, q);
        REP(i, q){
            YES(se.count(x[i]));
        }
    }

    int solve_test(int n, vl a) {
        // Write the test program.
        return 0;
    }

    int solve_naive(int n, vl a) {
        // Write a naive but correct program.
        return 0;
    }

    void random_test() {
        rnd.seed(seed_gen());

        uniform_int_distribution<int> dist_n(4, 10), dist_m(4, 10),
            dist_a(1, 20), dist_b(1, 20);

        for (int test = 1; test <= 100; test++) {
            int N = dist_n(rnd), M = dist_m(rnd);
            vl A = random_vl(N, 3, 20);
            auto Output = solve_test(N, A), Answer = solve_naive(N, A);
            if (Output != Answer) {
                cout << "Wrong Answer on Test #" << test << '\n';
                debug(N);
                debug(A);
                debug(Answer);
                debug(Output);
                break;
            }
        }
    }
};

signed main() {
    int T = 1;
    // cin >> T;

    Solver solver;
    while (T--)
        solver.solve();

    // solver.random_test();

    return 0;
}

Submission Info

Submission Time
Task C - A+B+C
User Honjo_Kaede
Language C++ 20 (gcc 12.2)
Score 250
Code Size 25996 Byte
Status AC
Exec Time 774 ms
Memory 51744 KiB

Compile Error

Main.cpp:1: warning: ignoring ‘#pragma region template’ [-Wunknown-pragmas]
    1 | #pragma region template
      | 
Main.cpp:691: warning: ignoring ‘#pragma endregion template’ [-Wunknown-pragmas]
  691 | #pragma endregion template
      | 
Main.cpp: In member function ‘long long int Solver::solve_test(long long int, vl)’:
Main.cpp:717:24: warning: unused parameter ‘n’ [-Wunused-parameter]
  717 |     int solve_test(int n, vl a) {
      |                        ^
Main.cpp:717:30: warning: unused parameter ‘a’ [-Wunused-parameter]
  717 |     int solve_test(int n, vl a) {
      |                           ~~~^
Main.cpp: In member function ‘long long int Solver::solve_naive(long long int, vl)’:
Main.cpp:722:25: warning: unused parameter ‘n’ [-Wunused-parameter]
  722 |     int solve_naive(int n, vl a) {
      |                         ^
Main.cpp:722:31: warning: unused parameter ‘a’ [-Wunused-parameter]
  722 |     int solve_naive(int n, vl a) {
      |                            ~~~^
Main.cpp: In member function ‘void Solver::random_test()’:
Main.cpp:734:34: warning: unused variable ‘M’ [-Wunused-variable]
  734 |             int N = dist_n(rnd), M = dist_m(rnd);
      |                                  ^

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 250 / 250
Status
AC × 1
AC × 23
Set Name Test Cases
Sample sample_01.txt
All min.txt, random_01.txt, random_02.txt, random_03.txt, random_04.txt, random_05.txt, random_06.txt, random_07.txt, random_08.txt, random_09.txt, random_10.txt, random_11.txt, random_12.txt, random_13.txt, random_14.txt, random_15.txt, random_16.txt, random_17.txt, random_18.txt, random_19.txt, random_20.txt, random_21.txt, sample_01.txt
Case Name Status Exec Time Memory
min.txt AC 1 ms 3432 KiB
random_01.txt AC 36 ms 6508 KiB
random_02.txt AC 15 ms 5256 KiB
random_03.txt AC 30 ms 5812 KiB
random_04.txt AC 632 ms 40136 KiB
random_05.txt AC 83 ms 12152 KiB
random_06.txt AC 46 ms 10620 KiB
random_07.txt AC 49 ms 8036 KiB
random_08.txt AC 765 ms 50232 KiB
random_09.txt AC 33 ms 5240 KiB
random_10.txt AC 84 ms 11344 KiB
random_11.txt AC 247 ms 21356 KiB
random_12.txt AC 739 ms 41176 KiB
random_13.txt AC 48 ms 6504 KiB
random_14.txt AC 386 ms 26404 KiB
random_15.txt AC 349 ms 26144 KiB
random_16.txt AC 774 ms 50752 KiB
random_17.txt AC 203 ms 51648 KiB
random_18.txt AC 199 ms 51744 KiB
random_19.txt AC 198 ms 51732 KiB
random_20.txt AC 190 ms 51580 KiB
random_21.txt AC 192 ms 51584 KiB
sample_01.txt AC 1 ms 3636 KiB