結果
問題 | No.1891 Static Xor Range Composite Query |
ユーザー |
|
提出日時 | 2022-07-12 03:11:20 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 909 ms / 5,000 ms |
コード長 | 1,544 bytes |
コンパイル時間 | 911 ms |
コンパイル使用メモリ | 81,452 KB |
最終ジャッジ日時 | 2025-01-30 06:40:55 |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 30 |
ソースコード
#include <iostream>#include <vector>#include <atcoder/modint>using mint = atcoder::modint998244353;struct F {mint a, b;mint eval(mint x) const { return a * x + b; }};F compose(F f, F g) { return F{ g.a * f.a, g.a * f.b + g.b }; }F id() { return F{ 1, 0 }; }int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);int n, q;std::cin >> n >> q;std::vector<std::vector<F>> seg(2 * n);for (int i = 0; i < n; ++i) {int a, b;std::cin >> a >> b;seg[n + i] = { F { a, b } };}for (int k = n - 1; k >= 1; --k) {const int siz = seg[2 * k].size();seg[k].resize(2 * siz);for (int s = 0; s < siz; ++s) {seg[k][0 * siz + s] = compose(seg[2 * k + 0][s], seg[2 * k + 1][s]);seg[k][1 * siz + s] = compose(seg[2 * k + 1][s], seg[2 * k + 0][s]);}}while (q --> 0) {int l, r, p, x;std::cin >> l >> r >> p >> x;auto query = [&](auto query, int tl, int tr, int k, int bit) -> F {if (r <= tl or tr <= l) return id();if (l <= tl and tr <= r) return seg[k][p & (bit - 1)];bit >>= 1;const bool flip = p & bit;const int tm = (tl + tr) >> 1;F sl = query(query, tl, tm, 2 * k + flip, bit);F sr = query(query, tm, tr, 2 * k + not flip, bit);return compose(sl, sr);};std::cout << query(query, 0, n, 1, n).eval(x).val() << '\n';}return 0;}