#include<bits/stdc++.h>
#define int unsigned
#define Arr std::vector
#define Ptn std::pair
#define fi first
#define se second
#define eb emplace_back
#define pb push_back
const int N = 1e6 + 5;
const int M = 5e6 + 5;
int T, n, m, cnt, a[N], b[N], c[N], idT[N], val[N], add[N], head[N], L[M], id[M], nxt[M], ans[M];
class FastIostream {
const int maxBF = 1 << 20;
char *inbuf, *inst, *ined, *oubuf, *oust, *oued;
void _flush() { fwrite(oubuf, 1, oued - oust, stdout); }
char _getchar() {
if (inst == ined) inst = inbuf, ined = inbuf + fread(inbuf, 1, maxBF, stdin);
return inst == ined ? EOF : *inst++;
} void _putchar(const char &c) {
if (oued == oust + maxBF) _flush(), oued = oubuf;
*oued++ = c;
}
public:
FastIostream() {
inst = ined = inbuf = new char[maxBF];
oust = oued = oubuf = new char[maxBF];
} ~FastIostream() {_flush();}
template <typename Int> FastIostream &operator>>(Int &n) {
static char c;
bool flag = false;
while ((c = _getchar()) < '0' || c > '9') if (c == '-') flag = true;
for (n = c - '0'; (c = _getchar()) >= '0' && c <= '9'; n = n * 10 + (c - 48));
if (flag) n = ~n + 1;
return *this;
} template <typename Int> FastIostream &operator<<(Int n) {
if (n < 0) _putchar('-'), n = ~n + 1;
static char S[40];
int t = 0;
do {S[t++] = '0' + n % 10, n /= 10;} while (n);
for (int i = 0; i < t; ++i) _putchar(S[t - i - 1]);
return *this;
} FastIostream &operator<<(const char *s) {
for (int i = 0; s[i]; ++i) _putchar(s[i]);
return *this;
}
} io;
//inline int gcd(int x, int y) {return x ? gcd(y % x, x) : y;}
signed main()
{
io >> n >> m;
for (int i = 1; i <= n; i++) io >> a[i];
for (int i = 1; i <= n; i++) io >> b[i];
for (int i = 1; i <= n; i++) io >> c[i];
for (int i = 1; i <= m; i++)
{
int l, r;
io >> l >> r;
if (!head[r]) head[r] = ++cnt, id[cnt] = i, L[cnt] = l;
else id[++cnt] = i, nxt[cnt] = head[r], head[r] = cnt, L[cnt] = l;
}
for (int i = 1; i <= n; i++)
{
int p = i - 1;
while (p != 0)
{
int t = std::__gcd(c[p], c[p + 1]);
if ((a[p] & a[p + 1]) == a[p] && (b[p] | b[p + 1]) == b[p] && t == c[p]) break;
a[p] = (a[p] & a[p + 1]), b[p] = (b[p] | b[p + 1]), c[p] = t;
p--;
}
val[i] = val[i - 1] + add[i - 1] * (T - idT[i - 1]);
int j = p + 1;
for (; j + 3 <= i; j += 4)
{
val[j] = val[j] + add[j] * (T - idT[j]);
add[j] = add[j - 1] + a[j] * b[j] * c[j];
idT[j] = T;
val[j + 1] = val[j + 1] + add[j + 1] * (T - idT[j + 1]);
add[j + 1] = add[j] + a[j + 1] * b[j + 1] * c[j + 1];
idT[j + 1] = T;
val[j + 2] = val[j + 2] + add[j + 2] * (T - idT[j + 2]);
add[j + 2] = add[j + 1] + a[j + 2] * b[j + 2] * c[j + 2];
idT[j + 2] = T;
val[j + 3] = val[j + 3] + add[j + 3] * (T - idT[j + 3]);
add[j + 3] = add[j + 2] + a[j + 3] * b[j + 3] * c[j + 3];
idT[j + 3] = T;
}
if (j > i) j -= 4;
for (; j <= i; j++)
{
val[j] = val[j] + add[j] * (T - idT[j]);
add[j] = add[j - 1] + a[j] * b[j] * c[j];
idT[j] = T;
}
T++;
for (int lop = head[i]; lop; lop = nxt[lop])
{
int Id = id[lop], l = L[lop];
ans[Id] = val[i] + add[i] * (T - idT[i]) - val[l - 1] - add[l - 1] * (T - idT[l - 1]);
}
}
for (int i = 1; i <= m; i++) io << ans[i] << "\n";
return 0;
}
最慢点差0.05s