#include <bits/stdc++.h>
using namespace std;
char buf[1 << 20], *p1 = buf, *p2 = buf, obuf[1 << 20], *O = obuf;
#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin), p1 == p2)? EOF : *p1++)
struct FastIO {
inline FastIO& operator >> (int& x) {
char ch = getchar();
while (ch > '9' || ch < '0') ch = getchar();
while (ch <= '9' && ch >= '0') x = (x << 1) + (x << 3) + ch - 48, ch = getchar();
return *this;
}
} rin;
#define ll long long
#define uint unsigned int
#define reg register
#define ld long double
#define uint unsigned int
#define ull unsigned long long
#define qint const int&
#define qll const ll&
#define quint cosnt uint&
#define qull const ull&
#define endl "\n"
inline void qmod(int& x, const int& mod) {
x = x >= mod ? x - mod : x;
}
const int N = 1e5 + 10, S = 1e5 + 1;
int n, m, a[N];
short cntA[N], b[N];
bool ansQ[N];
bitset<N> cnt, _cnt;
inline int64_t hilbertOrder(int x, int y, int pow, int rotate) {
if (pow == 0) {
return 0;
}
int hpow = 1 << (pow - 1);
int seg = (x < hpow) ? ((y < hpow) ? 0 : 3) : ((y < hpow) ? 1 : 2);
seg = (seg + rotate) & 3;
const int rotateDelta[4] = {3, 0, 0, 1};
int nx = x & (x ^ hpow), ny = y & (y ^ hpow);
int nrot = (rotate + rotateDelta[seg]) & 3;
int64_t subSquareSize = int64_t(1) << (2 * pow - 2);
int64_t ans = seg * subSquareSize;
int64_t add = hilbertOrder(nx, ny, pow - 1, nrot);
ans += (seg == 1 || seg == 2) ? add : (subSquareSize - add - 1);
return ans;
}
struct Query {
int id, opt, l, r, x, ord;
short blockID;
} q[N];
inline bool cmp(const Query& qA, const Query& qB) {
if (qA.ord != hilbertOrder(qA.l, qA.r, 21, 0)) exit(-1);
return hilbertOrder(qA.l, qA.r, 21, 0) < hilbertOrder(qB.l, qB.r, 21, 0);
}
inline void add(int id) {
++cntA[id];
_cnt[S - id] = cnt[id] = 1;
}
inline void del(int id) {
_cnt[S - id] = cnt[id] = (--cntA[id] != 0);
}
signed main() {
ios :: sync_with_stdio(false);
cout.tie(NULL);
rin >> n >> m;
const int B = sqrt(n << 1);
for (int i = 1; i <= n; ++i) rin >> a[i], b[i] = (i - 1) / B + 1;
for (int i = 1; i <= m; ++i) {
q[i].id = i;
rin >> q[i].opt >> q[i].l >> q[i].r >> q[i].x;
q[i].ord = hilbertOrder(q[i].l, q[i].r, 21, 0);
q[i].blockID = b[q[i].l];
}
stable_sort(q + 1, q + m + 1, cmp);
int l = 1, r = 0;
for (int i = 1; i <= m; ++i) {
while (r < q[i].r) add(a[++r]);
while (l > q[i].l) add(a[--l]);
while (r > q[i].r) del(a[r--]);
while (l < q[i].l) del(a[l++]);
if (q[i].opt == 3) {
for (short j = (((short)sqrt(q[i].x) >> 1) << 1) | 1; j >= 1; --j, j -= (q[i].x & 1))
if (q[i].x % j == 0) if (cnt[j] && cnt[q[i].x / j]) {
ansQ[q[i].id] = true;
break;
}
} else if (q[i].opt == 2) ansQ[q[i].id] = (cnt & (_cnt >> (S - q[i].x))).any();
else ansQ[q[i].id] = (cnt & (cnt >> q[i].x)).any();
}
for (int i = 1; i <= m; ++i)
cout << (ansQ[i] ? "hana\n" : "bi\n");
return 0;
}
开发者:Federico2903 & Murasame & quanac-lcx