結果

問題 No.854 公平なりんご分配
ユーザー Mayimg
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #

#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;
}
0