Submission #1132753

#TimeUsernameProblemLanguageResultExecution timeMemory
1132753MuhammetIntergalactic ship (IZhO19_xorsum)C++20
100 / 100
1098 ms14628 KiB
#include <bits/stdc++.h>	
using namespace std;

#define ff first
#define ss second
#define int long long

const int N = 5e5 + 5;
const int M = 1e9 + 7;

int n, q, ans, c[N];

vector <int> a, l, r, b;

int f(bool x, bool y, int A, int B, int C){
	int k = 1;
	if(A > 0) {
		k = 1LL * f(x,y,0,B,C) * c[A-1] % M;
		k += 1LL * f((1-x),(1-y),0,B,C) * (c[A-1]) % M;
		return k % M;
	}
	if(A == 0){
		if(x == 0){
			if (B > 0) k = (1LL * k * c[B-1]) % M;
			else k = 0; 
		}
		else {
			if (B > 0) k = (1LL * k * c[B-1]) % M;
		}
		if(y == 0){
			if (C > 0) k = (1LL * k * c[C-1]) % M;
			else k = 0;
		}
		else {
			if(C > 0) k = (1LL * k * c[C-1]) % M;
		}
	}
	return k % M;
}

signed main(){
	ios::sync_with_stdio(false); cin.tie(0);
	
	cin >> n;
	a.resize(n+1);
	for(int i = 1; i <= n; i++){
		cin >> a[i];
	}
	cin >> q;
	l.resize(q+1), r.resize(q+1), b.resize(q+1);
	for(int i = 1; i <= q; i++){
		cin >> l[i] >> r[i] >> b[i];
	}
	c[0] = 1;
	for(int i = 1; i < N; i++){
		c[i] = (c[i-1] * 2) % M;
	}
	int ans = 0;
	for(int x = 0; x <= 7; x++){
		for(int y = 0; y <= 7; y++){
			// cout << x << ' ' << y << "\n";
			vector <vector <int>> dp(n+2, vector <int> (n+2,0));
			vector <int> dp1(n+2, 0), dp2(n+2, 0);
			for(int i = 1; i <= q; i++){
				bool t1 = ((b[i]>>x)&1), t2 = ((b[i]>>y)&1);
				// cout << t1 << ' ' << t2 << '\n';
				if(t1 == 1 and t2 == 1){
					dp[l[i]][l[i]]++, dp[l[i]][r[i]+1]--, dp[r[i]+1][l[i]]--, dp[r[i]+1][r[i]+1]++;
				}
				if(t1 == 1){
					dp1[l[i]]++, dp1[r[i]+1]--;
				}
				if(t2 == 1){
					dp2[l[i]]++, dp2[r[i]+1]--;
				}
			}
			for(int i = 1; i <= n; i++){
				dp1[i] += dp1[i-1];
				dp2[i] += dp2[i-1];
				for(int j = 1; j <= n; j++){
					dp[i][j] += (dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1]);
					// cout << dp[i][j] << ' ';
				}
				// cout << '\n';
			}
			// cout << '\n';
			for(int i = 1; i <= n; i++){
				for(int j = i; j <= n; j++){
					int A = dp[i][j], B = dp1[i] - A, C = dp2[j] - A;
					int a1 = (1LL*i*(n-j+1)) % M, f1 = (f(((a[i]>>x)&1), ((a[j]>>y)&1), A, B, C) * 1LL * (i == j ? 1 : 2)) % M;
					ans += ((1LL * a1 * c[x+y] % M) * (1LL * f1 * c[q - A - B - C] % M)) % M;
					ans %= M;
				}
			}
		}
	}
	cout << ans << '\n';
	return 0;
}
#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...