运行时 VSCode 提示 segmentation fault

但是我访问到的数只有 131072,而我数组大小有 400020。
只有把 38 行的 tree tr[M]; 移到结构体外才行。
难道全局结构体的数组也不能开在结构体内吗?
代码中的 bit_2.in
bool ST;
#include <bits/stdc++.h>
#define ps putchar(' ')
#define pe putchar('\n')
#define int long long
#define ls p << 1
#define rs p << 1 | 1
#define mid ((l + r) >> 1)
using namespace std;
inline int read()
{
int f = 0, ans = 0;
char c = getchar();
while (!isdigit(c))
f |= c == '-', c = getchar();
while (isdigit(c))
ans = (ans << 3) + (ans << 1) + c - 48, c = getchar();
return f ? -ans : ans;
}
void write(int x)
{
if (x < 0)
putchar('-'), x = -x;
if (x > 9)
write(x / 10);
putchar(x % 10 + '0');
}
const int N = 1e5 + 5, M = N << 2, inf = (1ll << 31) - 1, mod = 998244353;
int n, m, a[N], pc[N];
struct tree
{
// or and appear total multiple
int o, an, ap, tot, mul;
} tmp[35], lt[35], init = {0, inf, -1, 0, 0};
inline tree pack(tree &l, tree &r) { return {l.o | r.o, l.an & r.an, l.ap != -1 ? l.ap : r.ap, l.tot + r.tot, l.mul | r.mul | l.ap != r.ap & l.ap != -1 & r.ap != -1}; }
struct Tree
{
tree tr[M];
void build(int l, int r, int p, int k)
{
if (l == r)
{
tr[p] = (pc[l] == k ? tree{a[l], a[l], a[l], 1, 0} : init);
return;
}
build(l, mid, ls, k), build(mid + 1, r, rs, k);
tr[p] = pack(tr[ls], tr[rs]);
}
tree ask(int l, int r, int s, int t, int p)
{
if (l >= s && r <= t)
return tr[p];
tree ans = {0, 0, -1};
if (mid >= s)
ans = ask(l, mid, s, t, ls);
if (mid < t)
{
tree T = ask(mid + 1, r, s, t, rs);
ans = (ans.tot == -1 ? T : pack(ans, T));
}
return ans;
}
inline void build(int k) { build(1, n, 1, k); }
inline tree ask(int s, int t) { return ask(1, n, s, t, 1); }
} t[30];
bool ED;
signed main()
{
freopen("bit_2.in", "r", stdin);
freopen("bit.out", "w", stdout);
n = read(), m = read();
for (int i = 1; i <= n; ++i)
pc[i] = __builtin_popcountll(a[i] = read());
for (int i = 0; i < 31; ++i)
t[i].build(i);
lt[0] = init;
while (m--)
{
int l = read(), r = read(), fl = 0;
if (t[0].ask(l, r).tot > 1)
{
puts("YES");
continue;
}
for (int i = 1; i <= 30; ++i)
lt[i] = pack(lt[i - 1], tmp[i] = t[i].ask(l, r));
tree rt = init;
for (int i = 30; i; rt = pack(rt, tmp[i--]))
if (!tmp[i].mul && tmp[i].tot)
if ((tmp[i].tot == 1 &&
((lt[i - 1].o | tmp[i].ap) == rt.an || lt[i - 1].o == (rt.an & tmp[i].ap))) ||
(tmp[i].tot != 1 && (lt[i - 1].o | tmp[i].ap) == (rt.an & tmp[i].ap)))
{
fl = 1;
break;
}
puts(fl ? "YES" : "NO");
}
return 0;
}