結果

問題 No.2988 Min-Plus Convolution Query
ユーザー hotman78hotman78
提出日時 2024-12-13 15:14:11
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
TLE  
実行時間 -
コード長 33,386 bytes
コンパイル時間 3,579 ms
コンパイル使用メモリ 244,020 KB
実行使用メモリ 202,740 KB
最終ジャッジ日時 2024-12-13 15:14:53
合計ジャッジ時間 37,199 ms
ジャッジサーバーID
(参考情報)
judge2 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
6,820 KB
testcase_01 AC 2 ms
6,816 KB
testcase_02 AC 1,307 ms
172,988 KB
testcase_03 AC 1,341 ms
175,864 KB
testcase_04 AC 1,360 ms
175,348 KB
testcase_05 AC 126 ms
46,468 KB
testcase_06 AC 2 ms
6,816 KB
testcase_07 AC 2 ms
6,820 KB
testcase_08 AC 3 ms
6,816 KB
testcase_09 AC 102 ms
18,172 KB
testcase_10 AC 104 ms
27,508 KB
testcase_11 AC 24 ms
9,120 KB
testcase_12 AC 47 ms
7,808 KB
testcase_13 AC 497 ms
37,840 KB
testcase_14 AC 57 ms
8,704 KB
testcase_15 AC 631 ms
62,624 KB
testcase_16 AC 1,237 ms
164,892 KB
testcase_17 AC 667 ms
49,852 KB
testcase_18 AC 592 ms
48,256 KB
testcase_19 AC 407 ms
41,084 KB
testcase_20 AC 1,877 ms
183,544 KB
testcase_21 AC 1,748 ms
172,796 KB
testcase_22 AC 1,392 ms
175,808 KB
testcase_23 AC 1,805 ms
177,964 KB
testcase_24 AC 1,857 ms
197,580 KB
testcase_25 AC 1,661 ms
173,124 KB
testcase_26 AC 1,800 ms
202,740 KB
testcase_27 AC 1,494 ms
176,128 KB
testcase_28 TLE -
testcase_29 AC 1,490 ms
176,432 KB
testcase_30 TLE -
testcase_31 AC 1,407 ms
175,720 KB
testcase_32 AC 2 ms
6,820 KB
testcase_33 AC 2 ms
6,816 KB
testcase_34 AC 2 ms
6,820 KB
testcase_35 AC 2 ms
6,816 KB
testcase_36 AC 2 ms
6,816 KB
testcase_37 AC 2 ms
6,820 KB
testcase_38 AC 2 ms
6,816 KB
testcase_39 AC 2 ms
6,816 KB
testcase_40 AC 2 ms
6,816 KB
testcase_41 AC 2 ms
6,816 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

// author: hotman78
// date: 2024/12/13-15:13:57

// --- begin raw code -----------------
// #include "cpplib/math/ACL_modint1000000007.hpp"
// #include "cpplib/util/template.hpp"
// 
// struct tree {
//     vector< lint > b;
//     vector< pair< lint, lint > > v;
//     lint n;
//     vec l, r;
//     vector< vector< tuple< lint, lint, lint > > > hist;
//     tree(vector< lint > &b): b(b) {
//         n = b.size();
//         v.resize(b.size() * 4, make_pair(0, INF));
//         l.resize(b.size() * 4);
//         r.resize(b.size() * 4);
//         rep(i, n * 2) {
//             l[i + n * 2] = i;
//             r[i + n * 2] = i;
//         }
//         rrep(i, 1, n * 2) {
//             l[i] = l[i * 2];
//             r[i] = r[i * 2 + 1];
//         }
//     }
//     lint get(lint p, lint x, lint k) {
//         if (k - p < 0) {
//             return b[0] + (1LL << 40) * (p - k) + x;
//         }
//         if (k - p >= n) {
//             return b.back() + (1LL << 40) * (k - p - n + 1) + x;
//         }
//         return b[k - p] + x;
//     }
//     void add(lint p, lint x) {
//         lint now = 1;
//         hist.emplace_back();
//         while (1) {
//             lint mid = (l[now] + r[now]) / 2;
//             if (get(v[now].first, v[now].second, mid) >
//                 get(p, x, mid)) {
//                 lint s = v[now].first;
//                 lint t = v[now].second;
//                 hist.back().emplace_back(now, s, t);
//                 v[now] = make_pair(p, x);
//                 p      = s;
//                 x      = t;
//             }
//             // cerr << now << " " << n << endl;
//             if (now >= n * 2) {
//                 break;
//             }
//             if (get(v[now].first, v[now].second, l[now]) >
//                 get(p, x, l[now])) {
//                 now = now * 2;
//             } else if (get(v[now].first, v[now].second, r[now]) >
//                        get(p, x, r[now])) {
//                 now = now * 2 + 1;
//             } else {
//                 break;
//             }
//         }
//     }
//     lint query(lint k) {
//         lint now = 1;
//         lint res = INF;
//         while (1) {
//             chmin(res, get(v[now].first, v[now].second, k));
//             if (now >= n * 2) break;
//             if (l[now * 2] <= k && k <= r[now * 2]) {
//                 now = now * 2;
//             } else {
//                 now = now * 2 + 1;
//             }
//         }
//         return res;
//     }
//     void rollback() {
//         while (hist.back().size()) {
//             auto [now, s, t] = hist.back().back();
//             hist.back().pop_back();
//             v[now] = make_pair(s, t);
//         }
//         hist.pop_back();
//     }
// };
// void solve() {
//     lint n, q;
//     cin >> n >> q;
//     vector< lint > a(n);
//     vector< lint > b(n);
//     rep(i, n) cin >> a[i];
//     rep(i, n) cin >> b[i];
//     lint cnt = 1;
//     while (n & (n - 1)) {
//         ++n;
//         a.emplace_back(INF);
//         b.emplace_back((1LL << 40) * cnt);
//         ++cnt;
//     }
//     tree t(b);
//     lint sz = q;
//     while (sz & (sz - 1)) sz++;
//     vector< vector< pair< lint, lint > > > v(sz * 2);
//     // rep(i, n) {
//     //     t.add(i, a[i]);
//     // }
//     vector< lint > qk(q);
//     vector< vector< pair< lint, lint > > > idx(n);
//     rep(i, q) {
//         lint p, x, k;
//         cin >> p >> x >> k;
//         --p;
//         k -= 2;
//         qk[i] = k;
//         if (i == 0) {
//             a[p] = x;
//             rep(j, n) {
//                 idx[j].emplace_back(0, a[j]);
//             }
//             continue;
//         } else {
//             idx[p].emplace_back(i, x);
//         }
//     }
//     rep(i, n) {
//         idx[i].emplace_back(q, -1);
//     }
//     // debug2(idx);
//     rep(i, n) {
//         if (a[i] == INF) continue;
//         rep(j, idx[i].size() - 1) {
//             lint l   = idx[i][j].first;
//             lint r   = idx[i][j + 1].first;
//             lint x   = idx[i][j].second;
//             lint now = 1, s = 0, t = sz;
//             auto dfs = [&](auto dfs, lint now, lint s, lint t) {
//                 if (l <= s && t <= r) {
//                     v[now].emplace_back(i, x);
//                     return;
//                 }
//                 lint mid = (s + t) / 2;
//                 // [s,mid) と [l,r) が交差している
//                 if (l < mid && s < r) {
//                     dfs(dfs, now * 2, s, mid);
//                 }
//                 if (l < t && mid < r) {
//                     dfs(dfs, now * 2 + 1, mid, t);
//                 }
//             };
//             dfs(dfs, now, s, t);
//         }
//     }
//     auto dfs = [&](auto dfs, lint now) -> void {
//         for (auto [i, x]: v[now]) {
//             t.add(i, x);
//         }
//         if (now >= sz) {
//             if (now - sz < qk.size()) {
//                 cout << t.query(qk[now - sz]) << endl;
//             }
//         }
//         if (now < sz) {
//             dfs(dfs, now * 2);
//             dfs(dfs, now * 2 + 1);
//         }
//         rep(i, v[now].size()) {
//             t.rollback();
//         }
//     };
//     // cerr << t.hist.size() << endl;
//     dfs(dfs, 1);
//     // cerr << t.hist.size() << endl;
// }
// int main() {
//     solve();
//     // lint t;cin>>t;while(t--)solve();
// }
// --- end raw code -----------------

#line 2 "cpplib/math/ACL_modint1000000007.hpp"

#include <cassert>
#include <numeric>
#include <type_traits>

#ifdef _MSC_VER
#include <intrin.h>
#endif

#include <utility>

#ifdef _MSC_VER
#include <intrin.h>
#endif

namespace atcoder {

namespace internal {

constexpr long long safe_mod(long long x, long long m) {
    x %= m;
    if (x < 0)
        x += m;
    return x;
}

struct barrett {
    unsigned int _m;
    unsigned long long im;

    explicit barrett(unsigned int m)
        : _m(m), im((unsigned long long)(-1) / m + 1) {}

    unsigned int umod() const { return _m; }

    unsigned int mul(unsigned int a, unsigned int b) const {

        unsigned long long z = a;
        z *= b;
#ifdef _MSC_VER
        unsigned long long x;
        _umul128(z, im, &x);
#else
        unsigned long long x =
            (unsigned long long)(((unsigned __int128)(z)*im) >> 64);
#endif
        unsigned int v = (unsigned int)(z - x * _m);
        if (_m <= v)
            v += _m;
        return v;
    }
};

constexpr long long pow_mod_constexpr(long long x, long long n, int m) {
    if (m == 1)
        return 0;
    unsigned int _m = (unsigned int)(m);
    unsigned long long r = 1;
    unsigned long long y = safe_mod(x, m);
    while (n) {
        if (n & 1)
            r = (r * y) % _m;
        y = (y * y) % _m;
        n >>= 1;
    }
    return r;
}

constexpr bool is_prime_constexpr(int n) {
    if (n <= 1)
        return false;
    if (n == 2 || n == 7 || n == 61)
        return true;
    if (n % 2 == 0)
        return false;
    long long d = n - 1;
    while (d % 2 == 0)
        d /= 2;
    constexpr long long bases[3] = {2, 7, 61};
    for (long long a : bases) {
        long long t = d;
        long long y = pow_mod_constexpr(a, t, n);
        while (t != n - 1 && y != 1 && y != n - 1) {
            y = y * y % n;
            t <<= 1;
        }
        if (y != n - 1 && t % 2 == 0) {
            return false;
        }
    }
    return true;
}
template <int n> constexpr bool is_prime = is_prime_constexpr(n);

constexpr std::pair<long long, long long> inv_gcd(long long a, long long b) {
    a = safe_mod(a, b);
    if (a == 0)
        return {b, 0};

    long long s = b, t = a;
    long long m0 = 0, m1 = 1;

    while (t) {
        long long u = s / t;
        s -= t * u;
        m0 -= m1 * u; // |m1 * u| <= |m1| * s <= b

        auto tmp = s;
        s = t;
        t = tmp;
        tmp = m0;
        m0 = m1;
        m1 = tmp;
    }
    if (m0 < 0)
        m0 += b / s;
    return {s, m0};
}

constexpr int primitive_root_constexpr(int m) {
    if (m == 2)
        return 1;
    if (m == 167772161)
        return 3;
    if (m == 469762049)
        return 3;
    if (m == 754974721)
        return 11;
    if (m == 998244353)
        return 3;
    int divs[20] = {};
    divs[0] = 2;
    int cnt = 1;
    int x = (m - 1) / 2;
    while (x % 2 == 0)
        x /= 2;
    for (int i = 3; (long long)(i)*i <= x; i += 2) {
        if (x % i == 0) {
            divs[cnt++] = i;
            while (x % i == 0) {
                x /= i;
            }
        }
    }
    if (x > 1) {
        divs[cnt++] = x;
    }
    for (int g = 2;; g++) {
        bool ok = true;
        for (int i = 0; i < cnt; i++) {
            if (pow_mod_constexpr(g, (m - 1) / divs[i], m) == 1) {
                ok = false;
                break;
            }
        }
        if (ok)
            return g;
    }
}
template <int m> constexpr int primitive_root = primitive_root_constexpr(m);

unsigned long long floor_sum_unsigned(unsigned long long n,
                                      unsigned long long m,
                                      unsigned long long a,
                                      unsigned long long b) {
    unsigned long long ans = 0;
    while (true) {
        if (a >= m) {
            ans += n * (n - 1) / 2 * (a / m);
            a %= m;
        }
        if (b >= m) {
            ans += n * (b / m);
            b %= m;
        }

        unsigned long long y_max = a * n + b;
        if (y_max < m)
            break;
        n = (unsigned long long)(y_max / m);
        b = (unsigned long long)(y_max % m);
        std::swap(m, a);
    }
    return ans;
}

} // namespace internal

} // namespace atcoder

#include <cassert>
#include <numeric>
#include <type_traits>

namespace atcoder {

namespace internal {

#ifndef _MSC_VER
template <class T>
using is_signed_int128 =
    typename std::conditional<std::is_same<T, __int128_t>::value ||
                                  std::is_same<T, __int128>::value,
                              std::true_type, std::false_type>::type;

template <class T>
using is_unsigned_int128 =
    typename std::conditional<std::is_same<T, __uint128_t>::value ||
                                  std::is_same<T, unsigned __int128>::value,
                              std::true_type, std::false_type>::type;

template <class T>
using make_unsigned_int128 =
    typename std::conditional<std::is_same<T, __int128_t>::value, __uint128_t,
                              unsigned __int128>;

template <class T>
using is_integral =
    typename std::conditional<std::is_integral<T>::value ||
                                  is_signed_int128<T>::value ||
                                  is_unsigned_int128<T>::value,
                              std::true_type, std::false_type>::type;

template <class T>
using is_signed_int =
    typename std::conditional<(is_integral<T>::value &&
                               std::is_signed<T>::value) ||
                                  is_signed_int128<T>::value,
                              std::true_type, std::false_type>::type;

template <class T>
using is_unsigned_int =
    typename std::conditional<(is_integral<T>::value &&
                               std::is_unsigned<T>::value) ||
                                  is_unsigned_int128<T>::value,
                              std::true_type, std::false_type>::type;

template <class T>
using to_unsigned = typename std::conditional<
    is_signed_int128<T>::value, make_unsigned_int128<T>,
    typename std::conditional<std::is_signed<T>::value, std::make_unsigned<T>,
                              std::common_type<T>>::type>::type;

#else

template <class T> using is_integral = typename std::is_integral<T>;

template <class T>
using is_signed_int =
    typename std::conditional<is_integral<T>::value && std::is_signed<T>::value,
                              std::true_type, std::false_type>::type;

template <class T>
using is_unsigned_int =
    typename std::conditional<is_integral<T>::value &&
                                  std::is_unsigned<T>::value,
                              std::true_type, std::false_type>::type;

template <class T>
using to_unsigned =
    typename std::conditional<is_signed_int<T>::value, std::make_unsigned<T>,
                              std::common_type<T>>::type;

#endif

template <class T>
using is_signed_int_t = std::enable_if_t<is_signed_int<T>::value>;

template <class T>
using is_unsigned_int_t = std::enable_if_t<is_unsigned_int<T>::value>;

template <class T> using to_unsigned_t = typename to_unsigned<T>::type;

} // namespace internal

} // namespace atcoder

namespace atcoder {

namespace internal {

struct modint_base {};
struct static_modint_base : modint_base {};

template <class T> using is_modint = std::is_base_of<modint_base, T>;
template <class T> using is_modint_t = std::enable_if_t<is_modint<T>::value>;

} // namespace internal

template <int m, std::enable_if_t<(1 <= m)> * = nullptr>
struct static_modint : internal::static_modint_base {
    using mint = static_modint;

  public:
    static constexpr int mod() { return m; }
    static mint raw(int v) {
        mint x;
        x._v = v;
        return x;
    }

    static_modint() : _v(0) {}
    template <class T, internal::is_signed_int_t<T> * = nullptr>
    static_modint(T v) {
        long long x = (long long)(v % (long long)(umod()));
        if (x < 0)
            x += umod();
        _v = (unsigned int)(x);
    }
    template <class T, internal::is_unsigned_int_t<T> * = nullptr>
    static_modint(T v) {
        _v = (unsigned int)(v % umod());
    }

    unsigned int val() const { return _v; }

    mint &operator++() {
        _v++;
        if (_v == umod())
            _v = 0;
        return *this;
    }
    mint &operator--() {
        if (_v == 0)
            _v = umod();
        _v--;
        return *this;
    }
    mint operator++(int) {
        mint result = *this;
        ++*this;
        return result;
    }
    mint operator--(int) {
        mint result = *this;
        --*this;
        return result;
    }

    mint &operator+=(const mint &rhs) {
        _v += rhs._v;
        if (_v >= umod())
            _v -= umod();
        return *this;
    }
    mint &operator-=(const mint &rhs) {
        _v -= rhs._v;
        if (_v >= umod())
            _v += umod();
        return *this;
    }
    mint &operator*=(const mint &rhs) {
        unsigned long long z = _v;
        z *= rhs._v;
        _v = (unsigned int)(z % umod());
        return *this;
    }
    mint &operator/=(const mint &rhs) { return *this = *this * rhs.inv(); }

    mint operator+() const { return *this; }
    mint operator-() const { return mint() - *this; }

    mint pow(long long n) const {
        assert(0 <= n);
        mint x = *this, r = 1;
        while (n) {
            if (n & 1)
                r *= x;
            x *= x;
            n >>= 1;
        }
        return r;
    }
    mint inv() const {
        if (prime) {
            assert(_v);
            return pow(umod() - 2);
        } else {
            auto eg = internal::inv_gcd(_v, m);
            assert(eg.first == 1);
            return eg.second;
        }
    }

    friend mint operator+(const mint &lhs, const mint &rhs) {
        return mint(lhs) += rhs;
    }
    friend mint operator-(const mint &lhs, const mint &rhs) {
        return mint(lhs) -= rhs;
    }
    friend mint operator*(const mint &lhs, const mint &rhs) {
        return mint(lhs) *= rhs;
    }
    friend mint operator/(const mint &lhs, const mint &rhs) {
        return mint(lhs) /= rhs;
    }
    friend bool operator==(const mint &lhs, const mint &rhs) {
        return lhs._v == rhs._v;
    }
    friend bool operator!=(const mint &lhs, const mint &rhs) {
        return lhs._v != rhs._v;
    }

  private:
    unsigned int _v;
    static constexpr unsigned int umod() { return m; }
    static constexpr bool prime = internal::is_prime<m>;
};

template <int id> struct dynamic_modint : internal::modint_base {
    using mint = dynamic_modint;

  public:
    static int mod() { return (int)(bt.umod()); }
    static void set_mod(int m) {
        assert(1 <= m);
        bt = internal::barrett(m);
    }
    static mint raw(int v) {
        mint x;
        x._v = v;
        return x;
    }

    dynamic_modint() : _v(0) {}
    template <class T, internal::is_signed_int_t<T> * = nullptr>
    dynamic_modint(T v) {
        long long x = (long long)(v % (long long)(mod()));
        if (x < 0)
            x += mod();
        _v = (unsigned int)(x);
    }
    template <class T, internal::is_unsigned_int_t<T> * = nullptr>
    dynamic_modint(T v) {
        _v = (unsigned int)(v % mod());
    }

    unsigned int val() const { return _v; }

    mint &operator++() {
        _v++;
        if (_v == umod())
            _v = 0;
        return *this;
    }
    mint &operator--() {
        if (_v == 0)
            _v = umod();
        _v--;
        return *this;
    }
    mint operator++(int) {
        mint result = *this;
        ++*this;
        return result;
    }
    mint operator--(int) {
        mint result = *this;
        --*this;
        return result;
    }

    mint &operator+=(const mint &rhs) {
        _v += rhs._v;
        if (_v >= umod())
            _v -= umod();
        return *this;
    }
    mint &operator-=(const mint &rhs) {
        _v += mod() - rhs._v;
        if (_v >= umod())
            _v -= umod();
        return *this;
    }
    mint &operator*=(const mint &rhs) {
        _v = bt.mul(_v, rhs._v);
        return *this;
    }
    mint &operator/=(const mint &rhs) { return *this = *this * rhs.inv(); }

    mint operator+() const { return *this; }
    mint operator-() const { return mint() - *this; }

    mint pow(long long n) const {
        assert(0 <= n);
        mint x = *this, r = 1;
        while (n) {
            if (n & 1)
                r *= x;
            x *= x;
            n >>= 1;
        }
        return r;
    }
    mint inv() const {
        auto eg = internal::inv_gcd(_v, mod());
        assert(eg.first == 1);
        return eg.second;
    }

    friend mint operator+(const mint &lhs, const mint &rhs) {
        return mint(lhs) += rhs;
    }
    friend mint operator-(const mint &lhs, const mint &rhs) {
        return mint(lhs) -= rhs;
    }
    friend mint operator*(const mint &lhs, const mint &rhs) {
        return mint(lhs) *= rhs;
    }
    friend mint operator/(const mint &lhs, const mint &rhs) {
        return mint(lhs) /= rhs;
    }
    friend bool operator==(const mint &lhs, const mint &rhs) {
        return lhs._v == rhs._v;
    }
    friend bool operator!=(const mint &lhs, const mint &rhs) {
        return lhs._v != rhs._v;
    }

  private:
    unsigned int _v;
    static internal::barrett bt;
    static unsigned int umod() { return bt.umod(); }
};
template <int id> internal::barrett dynamic_modint<id>::bt(998244353);

using modint998244353 = static_modint<998244353>;
using modint1000000007 = static_modint<1000000007>;
using modint = dynamic_modint<-1>;

namespace internal {

template <class T>
using is_static_modint = std::is_base_of<internal::static_modint_base, T>;

template <class T>
using is_static_modint_t = std::enable_if_t<is_static_modint<T>::value>;

template <class> struct is_dynamic_modint : public std::false_type {};
template <int id>
struct is_dynamic_modint<dynamic_modint<id>> : public std::true_type {};

template <class T>
using is_dynamic_modint_t = std::enable_if_t<is_dynamic_modint<T>::value>;

} // namespace internal

} // namespace atcoder

using mint = atcoder::modint1000000007;
#line 2 "cpplib/math/ACL_modint_base.hpp"
#include <fstream>
#include <vector>

std::ostream &operator<<(std::ostream &lhs, const mint &rhs) noexcept {
    lhs << rhs.val();
    return lhs;
}
std::istream &operator>>(std::istream &lhs, mint &rhs) noexcept {
    long long x;
    lhs >> x;
    rhs = x;
    return lhs;
}

int MOD_NOW = -1;
int FACT_TABLE_SIZE = 0;
std::vector<mint> fact_table, fact_inv_table;

void update(int x) {
    if (MOD_NOW != mint::mod() || FACT_TABLE_SIZE == 0) {
        fact_table.assign(1, 1);
        fact_inv_table.assign(1, 1);
        FACT_TABLE_SIZE = 1;
        MOD_NOW = mint::mod();
    }
    while (FACT_TABLE_SIZE <= x) {
        fact_table.resize(FACT_TABLE_SIZE * 2);
        fact_inv_table.resize(FACT_TABLE_SIZE * 2);
        for (int i = FACT_TABLE_SIZE; i < FACT_TABLE_SIZE * 2; ++i) {
            fact_table[i] = fact_table[i - 1] * i;
        }
        fact_inv_table[FACT_TABLE_SIZE * 2 - 1] =
            fact_table[FACT_TABLE_SIZE * 2 - 1].inv();
        for (int i = FACT_TABLE_SIZE * 2 - 2; i >= FACT_TABLE_SIZE; --i) {
            fact_inv_table[i] = fact_inv_table[i + 1] * (i + 1);
        }
        FACT_TABLE_SIZE *= 2;
    }
}

inline mint fact(int x) {
    assert(x >= 0);
    update(x);
    return fact_table[x];
}
inline mint fact_inv(int x) {
    assert(x >= 0);
    update(x);
    return fact_inv_table[x];
}
inline mint comb(int x, int y) {
    if (x < 0 || x < y || y < 0)
        return 0;
    return fact(x) * fact_inv(y) * fact_inv(x - y);
}
inline mint perm(int x, int y) { return fact(x) * fact_inv(x - y); }

// x個のグループにy個のものを分ける場合の数
inline mint multi_comb(int x, int y) {
    if (y == 0 && x >= 0)
        return 1;
    if (y < 0 || x <= 0)
        return 0;
    return comb(x + y - 1, y);
}
#line 2 "cpplib/util/template.hpp"
#ifdef LOCAL
#define _GLIBCXX_DEBUG
#endif
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("avx2")
using namespace std;
#line 1 "cpplib/util/ioutil.hpp"
// template <class Head,class... Args>
// std::ostream& output(std::ostream& out,const Head& head,const Args&... args){
//     out>>head;
//     return output(head,args...);
// }
// template <class Head>
// std::ostream& output(std::ostream& out,const Head& head){
//     out>>head;
//     return out;
// }

template <typename T, typename E>
std::ostream &operator<<(std::ostream &out, std::pair<T, E> v) {
    out << "(" << v.first << "," << v.second << ")";
    return out;
}

// template <class... Args>
// ostream& operator<<(ostream& out,std::tuple<Args...>v){
//     std::apply(output,v);
//     return out;
// }
#line 11 "cpplib/util/template.hpp"
struct __INIT__ {
    __INIT__() {
        cin.tie(0);
        ios::sync_with_stdio(false);
        cout << fixed << setprecision(15);
    }
} __INIT__;
typedef long long lint;
constexpr long long INF = 1LL << 60;
constexpr int IINF = 1 << 30;
constexpr double EPS = 1e-10;
#ifndef REACTIVE
#define endl '\n';
#endif
typedef vector<lint> vec;
typedef vector<vector<lint>> mat;
typedef vector<vector<vector<lint>>> mat3;
typedef vector<string> svec;
typedef vector<vector<string>> smat;
template <typename T> using V = vector<T>;
template <typename T> using VV = V<V<T>>;
#define output(t)                                                              \
    {                                                                          \
        bool f = 0;                                                            \
        for (auto val : (t)) {                                                 \
            cout << (f ? " " : "") << val;                                     \
            f = 1;                                                             \
        }                                                                      \
        cout << endl;                                                          \
    }
#define output2(t)                                                             \
    {                                                                          \
        for (auto i : t)                                                       \
            output(i);                                                         \
    }
#define debug(t)                                                               \
    {                                                                          \
        bool f = 0;                                                            \
        for (auto i : t) {                                                     \
            cerr << (f ? " " : "") << i;                                       \
            f = 1;                                                             \
        }                                                                      \
        cerr << endl;                                                          \
    }
#define debug2(t)                                                              \
    {                                                                          \
        for (auto i : t)                                                       \
            debug(i);                                                          \
    }
#define loop(n) for (long long _ = 0; _ < (long long)(n); ++_)
#define _overload4(_1, _2, _3, _4, name, ...) name
#define __rep(i, a) repi(i, 0, a, 1)
#define _rep(i, a, b) repi(i, a, b, 1)
#define repi(i, a, b, c)                                                       \
    for (long long i = (long long)(a); i < (long long)(b); i += c)
#define rep(...) _overload4(__VA_ARGS__, repi, _rep, __rep)(__VA_ARGS__)
#define _overload3_rev(_1, _2, _3, name, ...) name
#define _rep_rev(i, a) repi_rev(i, 0, a)
#define repi_rev(i, a, b)                                                      \
    for (long long i = (long long)(b)-1; i >= (long long)(a); --i)
#define rrep(...) _overload3_rev(__VA_ARGS__, repi_rev, _rep_rev)(__VA_ARGS__)

#define all(n) begin(n), end(n)
template <typename T, typename E> bool chmin(T &s, const E &t) {
    bool res = s > t;
    s = min<T>(s, t);
    return res;
}
template <typename T, typename E> bool chmax(T &s, const E &t) {
    bool res = s < t;
    s = max<T>(s, t);
    return res;
}
const vector<lint> dx = {1, 0, -1, 0, 1, 1, -1, -1};
const vector<lint> dy = {0, 1, 0, -1, 1, -1, 1, -1};
#define SUM(v) accumulate(all(v), 0LL)
#if __cplusplus >= 201703L
template <typename T, typename... Args>
auto make_vector(T x, int arg, Args... args) {
    if constexpr (sizeof...(args) == 0)
        return vector<T>(arg, x);
    else
        return vector(arg, make_vector<T>(x, args...));
}
#endif
#define bit(n, a) ((n >> a) & 1)
#define extrep(v, ...) for (auto v : make_mat_impl({__VA_ARGS__}))
vector<vector<long long>> make_mat_impl(vector<long long> v) {
    if (v.empty())
        return vector<vector<long long>>(1, vector<long long>());
    long long n = v.back();
    v.pop_back();
    vector<vector<long long>> ret;
    vector<vector<long long>> tmp = make_mat_impl(v);
    for (auto e : tmp)
        for (long long i = 0; i < n; ++i) {
            ret.push_back(e);
            ret.back().push_back(i);
        }
    return ret;
}
using graph = vector<vector<int>>;
template <typename T> using graph_w = vector<vector<pair<int, T>>>;

#if __cplusplus >= 201703L
constexpr inline long long powll(long long a, long long b) {
    long long res = 1;
    while (b--)
        res *= a;
    return res;
}
#endif

template <typename T, typename E>
pair<T, E> &operator+=(pair<T, E> &s, const pair<T, E> &t) {
    s.first += t.first;
    s.second += t.second;
    return s;
}
template <typename T, typename E>
pair<T, E> &operator-=(pair<T, E> &s, const pair<T, E> &t) {
    s.first -= t.first;
    s.second -= t.second;
    return s;
}
template <typename T, typename E>
pair<T, E> operator+(const pair<T, E> &s, const pair<T, E> &t) {
    auto res = s;
    return res += t;
}
template <typename T, typename E>
pair<T, E> operator-(const pair<T, E> &s, const pair<T, E> &t) {
    auto res = s;
    return res -= t;
}
#define BEGIN_STACK_EXTEND(size)                                               \
    void *stack_extend_memory_ = malloc(size);                                 \
    void *stack_extend_origin_memory_;                                         \
    char *stack_extend_dummy_memory_ = (char *)alloca(                         \
        (1 + (int)(((long long)stack_extend_memory_) & 127)) * 16);            \
    *stack_extend_dummy_memory_ = 0;                                           \
    asm volatile("mov %%rsp, %%rbx\nmov %%rax, %%rsp"                          \
                 : "=b"(stack_extend_origin_memory_)                           \
                 : "a"((char *)stack_extend_memory_ + (size)-1024));
#define END_STACK_EXTEND                                                       \
    asm volatile("mov %%rax, %%rsp" ::"a"(stack_extend_origin_memory_));       \
    free(stack_extend_memory_);
int floor_pow(int n) { return n ? 31 - __builtin_clz(n) : 0; }
#line 3 "main.cpp"

struct tree {
    vector<lint> b;
    vector<pair<lint, lint>> v;
    lint n;
    vec l, r;
    vector<vector<tuple<lint, lint, lint>>> hist;
    tree(vector<lint> &b) : b(b) {
        n = b.size();
        v.resize(b.size() * 4, make_pair(0, INF));
        l.resize(b.size() * 4);
        r.resize(b.size() * 4);
        rep(i, n * 2) {
            l[i + n * 2] = i;
            r[i + n * 2] = i;
        }
        rrep(i, 1, n * 2) {
            l[i] = l[i * 2];
            r[i] = r[i * 2 + 1];
        }
    }
    lint get(lint p, lint x, lint k) {
        if (k - p < 0) {
            return b[0] + (1LL << 40) * (p - k) + x;
        }
        if (k - p >= n) {
            return b.back() + (1LL << 40) * (k - p - n + 1) + x;
        }
        return b[k - p] + x;
    }
    void add(lint p, lint x) {
        lint now = 1;
        hist.emplace_back();
        while (1) {
            lint mid = (l[now] + r[now]) / 2;
            if (get(v[now].first, v[now].second, mid) > get(p, x, mid)) {
                lint s = v[now].first;
                lint t = v[now].second;
                hist.back().emplace_back(now, s, t);
                v[now] = make_pair(p, x);
                p = s;
                x = t;
            }
            // cerr << now << " " << n << endl;
            if (now >= n * 2) {
                break;
            }
            if (get(v[now].first, v[now].second, l[now]) > get(p, x, l[now])) {
                now = now * 2;
            } else if (get(v[now].first, v[now].second, r[now]) >
                       get(p, x, r[now])) {
                now = now * 2 + 1;
            } else {
                break;
            }
        }
    }
    lint query(lint k) {
        lint now = 1;
        lint res = INF;
        while (1) {
            chmin(res, get(v[now].first, v[now].second, k));
            if (now >= n * 2)
                break;
            if (l[now * 2] <= k && k <= r[now * 2]) {
                now = now * 2;
            } else {
                now = now * 2 + 1;
            }
        }
        return res;
    }
    void rollback() {
        while (hist.back().size()) {
            auto [now, s, t] = hist.back().back();
            hist.back().pop_back();
            v[now] = make_pair(s, t);
        }
        hist.pop_back();
    }
};
void solve() {
    lint n, q;
    cin >> n >> q;
    vector<lint> a(n);
    vector<lint> b(n);
    rep(i, n) cin >> a[i];
    rep(i, n) cin >> b[i];
    lint cnt = 1;
    while (n & (n - 1)) {
        ++n;
        a.emplace_back(INF);
        b.emplace_back((1LL << 40) * cnt);
        ++cnt;
    }
    tree t(b);
    lint sz = q;
    while (sz & (sz - 1))
        sz++;
    vector<vector<pair<lint, lint>>> v(sz * 2);
    // rep(i, n) {
    //     t.add(i, a[i]);
    // }
    vector<lint> qk(q);
    vector<vector<pair<lint, lint>>> idx(n);
    rep(i, q) {
        lint p, x, k;
        cin >> p >> x >> k;
        --p;
        k -= 2;
        qk[i] = k;
        if (i == 0) {
            a[p] = x;
            rep(j, n) { idx[j].emplace_back(0, a[j]); }
            continue;
        } else {
            idx[p].emplace_back(i, x);
        }
    }
    rep(i, n) { idx[i].emplace_back(q, -1); }
    // debug2(idx);
    rep(i, n) {
        if (a[i] == INF)
            continue;
        rep(j, idx[i].size() - 1) {
            lint l = idx[i][j].first;
            lint r = idx[i][j + 1].first;
            lint x = idx[i][j].second;
            lint now = 1, s = 0, t = sz;
            auto dfs = [&](auto dfs, lint now, lint s, lint t) {
                if (l <= s && t <= r) {
                    v[now].emplace_back(i, x);
                    return;
                }
                lint mid = (s + t) / 2;
                // [s,mid) と [l,r) が交差している
                if (l < mid && s < r) {
                    dfs(dfs, now * 2, s, mid);
                }
                if (l < t && mid < r) {
                    dfs(dfs, now * 2 + 1, mid, t);
                }
            };
            dfs(dfs, now, s, t);
        }
    }
    auto dfs = [&](auto dfs, lint now) -> void {
        for (auto [i, x] : v[now]) {
            t.add(i, x);
        }
        if (now >= sz) {
            if (now - sz < qk.size()) {
                cout << t.query(qk[now - sz]) << endl;
            }
        }
        if (now < sz) {
            dfs(dfs, now * 2);
            dfs(dfs, now * 2 + 1);
        }
        rep(i, v[now].size()) { t.rollback(); }
    };
    // cerr << t.hist.size() << endl;
    dfs(dfs, 1);
    // cerr << t.hist.size() << endl;
}
int main() {
    solve();
    // lint t;cin>>t;while(t--)solve();
}
0