結果
| 問題 |
No.2395 区間二次変換一点取得
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-07-28 22:32:15 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 253 ms / 2,000 ms |
| コード長 | 1,070 bytes |
| コンパイル時間 | 1,943 ms |
| コンパイル使用メモリ | 197,600 KB |
| 最終ジャッジ日時 | 2025-02-15 20:34:28 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 20 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
struct BIT {
private:
vector<int> bit;
int N;
public:
BIT(int size) {
N = size;
bit.resize(N + 1);
}
void add(int a, int w) {
for(int x = a; x <= N; x += x & -x) {
bit[x] += w;
}
}
int sum(int a) {
int ret = 0;
for (int x = a; x > 0; x -= x & -x) {
ret += bit[x];
}
return ret;
}
};
int main() {
long long N, B, Q;
cin >> N >> B >> Q;
BIT fw(N + 5);
vector<long long> sq(Q + 5), s(Q + 5), t(Q + 5);
sq[0] = 0;
for(long long i = 1; i <= Q + 4; i++) {
sq[i] = i * i % B;
s[i] = i % B;
}
t[2] = 1;
for(int i = 3; i <= Q + 4; i++) {
t[i] = t[i - 1] * 3 % B;
}
while(Q--) {
int L, M, R;
cin >> L >> M >> R;
fw.add(L, 1);
fw.add(R + 1, -1);
int x = fw.sum(M) + 1;
long long y;
if(x == 1) {
y = 1;
} else {
y = t[x] * (sq[x] + s[x] + 1) % B;
}
int z = t[x + 1];
cout << x % B << ' ' << y % B << ' ' << z % B << '\n';
}
return 0;
}