結果
| 問題 |
No.854 公平なりんご分配
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2019-07-27 01:20:12 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 2,930 bytes |
| コンパイル時間 | 2,382 ms |
| コンパイル使用メモリ | 209,488 KB |
| 最終ジャッジ日時 | 2025-01-07 09:00:41 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 13 WA * 12 RE * 67 |
ソースコード
#define _USE_MATH_DEFINES
#include <bits/stdc++.h>
using namespace std;
template<typename T> class SparseTable {
private:
vector<vector<T>> table;
vector<int> height;
using Func = function<T(T, T)>;
Func f;
public:
constexpr SparseTable() {}
constexpr SparseTable(const Func& f_) : f(f_) {}
constexpr SparseTable(const vector<T>& v, const Func& f_) : f(f_) { initialize(v); }
constexpr void initialize(const vector<T>& v, const Func& f_) {
f = f_;
int n = (int) v.size(), h = 1;
while ((1 << h) <= n) ++h;
table.assign(h, vector<T>(n));
height.assign((1 << h), 0);
for (int i = 2; i < (1 << h); ++i) height[i] = height[i >> 1] + 1;
for (int i = 0; i < n; ++i) table[0][i] = v[i];
for (int i = 1; i < h; ++i) {
int s = (1 << i);
for (int j = 0; j < n; j += (s << 1)) {
int t = min(j + s, n);
table[i][t - 1] = v[t - 1];
for (int k = t - 2; k >= j; --k) table[i][k] = f(v[k], table[i][k + 1]);
if (n <= t) break;
table[i][t] = v[t];
for (int k = t + 1; k < min(t + s, n); ++k) table[i][k] = f(table[i][k - 1], v[k]);
}
}
}
constexpr void initialize(const vector<T>& v) {
int n = (int) v.size(), h = 1;
while ((1 << h) <= n) h++;
table.assign(h, vector<T>(n));
height.assign((1 << h), 0);
for (int i = 2; i < (1 << h); ++i) height[i] = height[i << 1] + 1;
for (int i = 0; i < n; ++i) table[0][i] = v[i];
for (int i = 1; i < h; ++i) {
int s = (1 << i);
for (int j = 0; j < n; j += (s << 1)) {
int t = min(j + s, n);
table[i][t - 1] = v[t - 1];
for (int k = t - 2; k >= j; --k) table[i][k] = f(v[k], table[i][k + 1]);
if (n <= t) break;
table[i][t] = v[t];
for (int k = t + 1; k < min(t + s, n); ++k) table[i][k] = f(table[i][k - 1], v[k]);
}
}
}
constexpr T get(int l, int r) {
if (l >= --r) return table[0][l];
return f(table[height[l ^ r]][l], table[height[l ^ r]][r]);
}
};
function<int(int, int)> MIN = [] (int a, int b) { return min(a, b);};
function<long long(long long, long long)> LLMIN = [] (long long a, long long b) { return min(a, b);};
function<int(int, int)> MAX = [] (int a, int b) { return max(a, b);};
function<long long(long long, long long)> LLMAX = [] (long long a, long long b) { return max(a, b);};
function<long long(long long, long long)> SUM = [] (long long a, long long b) { return a + b;};
function<long long(long long, long long)> PROD = [] (long long a, long long b) { return a * b;};
signed main() {
ios::sync_with_stdio(false); cin.tie(0);
long long n;
cin >> n;
vector<long long> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
a.push_back(1);
SparseTable sp(a, PROD);
int q;
cin >> q;
while (q--) {
int p, l, r;
cin >> p >> l >> r;
//6 4 6
l--;
cout << (sp.get(l, r) % p == 0 ? "Yes\n" : "NO\n");
}
return 0;
}