带注释的地方如果加上就会MLE,救救我!
#include <bits/stdc++.h>
using namespace std;
int read()
{
int f = 1;
char c = getchar();
while (!isdigit(c))
{
if (c == '-') f = -1;
c = getchar();
}
int x = 0;
while (isdigit(c))
{
x = x * 10 + c - '0';
c = getchar();
}
return x * f;
}
int n, m, B, a[100005], cnt[100005], pos[100005], L[100005][325], R[100005][325];
bool ans[100005];
bitset < 100005 > s1, s2, s3;
struct node
{
int num, op, l, r, x;
} eve[100005];
bool cmp(node q, node p)
{
if ((q.l - 1) / B == (p.l - 1) / B)
{
if (((q.l - 1) / B) % 2 == 1) return q.r > p.r;
return q.r < p.r;
}
return q.l < p.l;
}
bool md(int x)
{
int t = sqrt(x);
for (int i = 1; i <= t; i++)
if (x % i == 0)
if (s1[i] == 1 && s1[x / i] == 1) return 1;
return 0;
}
bool md2(int x)
{
for (int i = 1; i <= 100000 / x; i++)
if (s1[i] == 1 && s1[i * x] == 1) return 1;
return 0;
}
int main()
{
n = read(), m = read();
B = sqrt(100000);
for (int i = 1; i <= n; i++)
a[i] = read();
for (int i = 1; i <= n; i++)
{
pos[a[i]] = i;
for (int j = 0; j <= B; j++)
if (a[i] * j <= 100000)
{
L[i][j] = pos[a[i] * j];
L[i][j] = max(L[i][j], L[i - 1][j]);
}
else
{
L[i][j] = 0;
L[i][j] = max(L[i][j], L[i - 1][j]);
}
}
for (int i = 0; i <= 100000; i++)
pos[i] = n + 1;
for (int i = 0; i <= B; i++)
R[n + 1][i] = n + 1;
for (int i = n; i >= 1; i--)
{
pos[a[i]] = i;
for (int j = 0; j <= B; j++)
if (a[i] * j <= 100000)
{
}
else
{
}
}
for (int i = 1; i <= m; i++)
{
eve[i].num = i;
eve[i].op = read();
eve[i].l = read();
eve[i].r = read();
eve[i].x = read();
}
sort(eve + 1, eve + m + 1, cmp);
int tl = 1, tr = 0;
for (int i = 1; i <= m; i++)
{
int l = eve[i].l, r = eve[i].r;
while (tl > l)
{
tl--;
cnt[a[tl]]++;
if (cnt[a[tl]] > 0)
{
s1[a[tl]] = 1;
s2[100000 - a[tl]] = 1;
}
}
while (tr < r)
{
tr++;
cnt[a[tr]]++;
if (cnt[a[tr]] > 0)
{
s1[a[tr]] = 1;
s2[100000 - a[tr]] = 1;
}
}
while (tl < l)
{
cnt[a[tl]]--;
if (cnt[a[tl]] <= 0)
{
s1[a[tl]] = 0;
s2[100000 - a[tl]] = 0;
}
tl++;
}
while (tr > r)
{
cnt[a[tr]]--;
if (cnt[a[tr]] <= 0)
{
s1[a[tr]] = 0;
s2[100000 - a[tr]] = 0;
}
tr--;
}
if (eve[i].op == 1)
{
s3 = s1 & (s1 << eve[i].x);
if (s3.count()) ans[eve[i].num] = 1;
else ans[eve[i].num] = 0;
}
else if (eve[i].op == 2)
{
s3 = s1 & (s2 >> (100000 - eve[i].x));
if (s3.count()) ans[eve[i].num] = 1;
else ans[eve[i].num] = 0;
}
else if (eve[i].op == 3)
{
if (md(eve[i].x)) ans[eve[i].num] = 1;
else ans[eve[i].num] = 0;
}
else
{
if (eve[i].x <= B)
{
if (L[eve[i].r][eve[i].x] < eve[i].l) ans[eve[i].num] = 0;
else ans[eve[i].num] = 1;
}
else
{
if (md2(eve[i].x)) ans[eve[i].num] = 1;
else ans[eve[i].num] = 0;
}
}
}
for (int i = 1; i <= m; i++)
{
if (ans[i] == 1) printf("yuno\n");
else printf("yumi\n");
}
return 0;
}