結果
| 問題 |
No.2395 区間二次変換一点取得
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-07-28 21:51:49 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 192 ms / 2,000 ms |
| コード長 | 2,875 bytes |
| コンパイル時間 | 2,150 ms |
| コンパイル使用メモリ | 204,676 KB |
| 最終ジャッジ日時 | 2025-02-15 20:17:47 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 20 |
ソースコード
#ifndef hari64
#include <bits/stdc++.h>
#pragma GCC target("avx2")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#define debug(...)
#else
#include "util/viewer.hpp"
#define debug(...) viewer::_debug(__LINE__, #__VA_ARGS__, __VA_ARGS__)
#endif
// clang-format off
using namespace std;
using ll = long long; using ld = long double;
using pii = pair<int, int>; using pll = pair<ll, ll>;
template <typename T> using vc = vector<T>;
template <typename T> using vvc = vector<vc<T>>;
template <typename T> using vvvc = vector<vvc<T>>;
using vi = vc<int>; using vll = vc<ll>; using vpii = vc<pii>; using vpll = vc<pll>;
using vvi = vc<vi>; using vvll = vc<vll>; using vvpi = vc<vpii>; using vvpll = vc<vpll>;
constexpr int INF = 1001001001; constexpr long long INFll = 1001001001001001001;
template <class T> bool chmax(T& a, const T& b) { return a < b ? a = b, 1 : 0; }
template <class T> bool chmin(T& a, const T& b) { return a > b ? a = b, 1 : 0; }
// clang-format on
template <class T>
struct fenwick_tree {
fenwick_tree() : _n(0) {}
explicit fenwick_tree(int n) : _n(n), data(n) {}
explicit fenwick_tree(vector<T>& As) : _n(As.size()), data(As) {}
// A[idx]+=x
void add(int idx, T x) {
assert(0 <= idx && idx < _n);
idx++;
while (idx <= _n) {
data[idx - 1] += x;
idx += idx & -idx;
}
}
// Σ_[l,r)
T sum(int l, int r) const {
assert(0 <= l && l <= r && r <= _n);
return _sum(r) - _sum(l);
}
// Σ_[0,r)
T sum(int r) const {
assert(0 <= r && r <= _n);
return _sum(r);
}
// A[idx] O(logN)
T get(int idx) const {
assert(0 <= idx && idx < _n);
return sum(idx, idx + 1);
}
// debug
vector<T> state() const {
vector<T> ret(_n);
for (int i = 0; i < _n; i++) ret[i] = get(i);
return ret;
}
inline T operator[](int idx) const { return get(idx); }
private:
int _n;
vector<T> data;
T _sum(int r) const {
T s = 0;
while (r > 0) s += data[r - 1], r -= r & -r;
return s;
}
};
int main() {
cin.tie(0);
ios::sync_with_stdio(false);
ll N, B, Q;
cin >> N >> B >> Q;
fenwick_tree<int> count(N + 1);
vc<tuple<ll, ll, ll>> answers(Q + 10);
answers[0] = {1, 1, 1};
for (int i = 0; i < Q + 5; i++) {
auto [x, y, z] = answers[i];
answers[i + 1] = {
(x + 1) % B,
((3 * y % B) + (2 * x * z % B) + (2 * z % B)) % B,
(3 * z) % B,
};
}
for (int i = 0; i < Q; i++) {
ll L;
ll M;
ll R;
cin >> L >> M >> R;
count.add(L - 1, 1);
count.add(R, -1);
int cnt = count.sum(M);
auto [x, y, z] = answers[cnt];
cout << x << " " << y << " " << z << endl;
}
return 0;
}