Submission #1132297

#TimeUsernameProblemLanguageResultExecution timeMemory
1132297stdfloatIntergalactic ship (IZhO19_xorsum)C++20
100 / 100
1148 ms6032 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

const int md = (int)1e9 + 7;

vector<int> pw;

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);
}

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;

	pw.assign(max(7, q) + 1, 1);
	for (int i = 1; i <= max(7, q); 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) {
					dp[l[i]][l[i]]++; dp[r[i] + 1][r[i] + 1]++;
					dp[r[i] + 1][l[i]]--; dp[l[i]][r[i] + 1]--;
				}
			}

			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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...