#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int Q = (int)1e5 + 1, md = (int)1e9 + 7;
vector<int> pw(Q, 1);
vector<vector<int>> dp;
ll MD(ll x) {
return (x % md + md) % md;
}
int f(bool x, bool y, int a, int b, int c) {
if (~a) {
if (!a) return f(x, y, -1, b, c);
return MD((ll)pw[a - 1] * MD(f(x, y, -1, b, c) + f(!x, !y, -1, b, c)));
}
else if (~b) return MD((ll)(b ? pw[b - 1] : x) * f(true, y, -1, -1, c));
else return (c ? pw[c - 1] : y);
}
void ad(int a, int b, int c, int d) {
dp[a][b]++; dp[c + 1][d + 1]++;
dp[c + 1][b]--; dp[a][d + 1]--;
}
int main() {
ios::sync_with_stdio(false); cin.tie(nullptr);
int n;
cin >> n;
vector<int> a(n + 1);
for (int i = 1; i <= n; i++)
cin >> a[i];
int q;
cin >> q;
for (int i = 1; i <= q + 10; i++)
pw[i] = MD(pw[i - 1] << 1);
vector<int> l(q + 1), r(q + 1), X(q + 1);
for (int i = 1; i <= q; i++)
cin >> l[i] >> r[i] >> X[i];
int ans = 0;
for (int x = 0; x < 8; x++) {
for (int y = 0; y < 8; y++) {
dp.assign(n + 2, vector<int>(n + 2));
vector<vector<int>> p(n + 2, vector<int>(2));
for (int i = 1; i <= q; i++) {
bool tr1 = (X[i] >> x) & 1, tr2 = (X[i] >> y) & 1;
if (tr1) {
p[l[i]][0]++;
p[r[i] + 1][0]--;
}
if (tr2) {
p[l[i]][1]++;
p[r[i] + 1][1]--;
}
if (tr1 && tr2) ad(l[i], l[i], r[i], r[i]);
}
for (int i = 1; i <= n; i++) {
p[i][0] += p[i - 1][0];
p[i][1] += p[i - 1][1];
for (int j = 1; j <= n; j++)
dp[i][j] += dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1];
}
for (int i = 1; i <= n; i++) {
for (int j = i; j <= n; j++) {
int A = dp[i][j], B = p[i][0] - dp[i][j], C = p[j][1] - dp[i][j];
int vl = MD((ll)(1 + (i != j)) * pw[x] * pw[y]);
int pr = MD((ll)i * (n - j + 1));
int cnt = f((a[i] >> x) & 1, (a[j] >> y) & 1, A, B, C);
ans = MD(ans + MD(MD(MD(vl * pr) * cnt) * pw[q - A - B - C]));
}
}
}
}
cout << ans;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |