#include<bits/stdc++.h>
#define fi first
#define se second
#define all(v) begin(v), end(v)
#define rall(v) rbegin(v), rend(v)
#define compact(v) v.erase(unique(all(v)), end(v))
#define sz(v) (int)(v).size()
#define endl "\n"
#define dbg(x) "[" #x " = " << (x) << "]"
using namespace std;
template<class T> bool minimize(T& a, T b){
if(a > b) return a = b, true;
return false;
}
template<class T> bool maximize(T& a, T b){
if(a < b) return a = b, true;
return false;
}
typedef long long ll;
void fastIO(){
ios_base::sync_with_stdio(NULL); cin.tie(0);
#ifdef LOCAL
freopen("task.INP", "r", stdin);
freopen("task.OUT", "w", stdout);
#endif
}
const int MAX = 1e5 + 5;
const int MOD = 1e9 + 7;
int add(int a, int b) {if(a >= MOD - b) return a - MOD + b; return a + b;}
int mul(int a, int b) {return 1LL*a*b;}
int n, q;
int a[1005];
int L[MAX], R[MAX], X[128];
int pw2[MAX];
int answer = 0;
int flip[3][1005][1005];
void add_contribution(int bit1, int bit2){
for(int k = 0; k < 3; k++){
for(int i = 0; i <= n; i++){
for(int j = 0; j <= n; j++) flip[k][i][j] = 0;
}
}
auto update_rect = [&](int type, int x1, int y1, int x2, int y2) -> void{
flip[type][x1][y1]++;
flip[type][x2+1][y1]--;
flip[type][x1][y2+1]--;
flip[type][x2+1][y2+1]++;
};
for(int i = 1; i <= q; i++){
int on_bit1 = (X[i] >> bit1) & 1;
int on_bit2 = (X[i] >> bit2) & 1;
if(on_bit1 && on_bit2){
update_rect(0, L[i], L[i], R[i], R[i]);
update_rect(2, 1, L[i], L[i] - 1, R[i]);
update_rect(1, L[i], R[i] + 1, R[i], n);
}
else if(on_bit1){
update_rect(1, L[i], 1, R[i], n);
}
else if(on_bit2){
update_rect(2, 1, L[i], n, R[i]);
}
}
auto contrib = [&](int n, int bit) -> int{
if(!n) return bit ^= 1;
return pw2[n-1];
};
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
for(int k = 0; k < 3; k++){
flip[k][i][j] += flip[k][i-1][j] + flip[k][i][j-1] - flip[k][i-1][j-1];
}
}
}
for(int i = 1; i <= n; i++){
for(int j = i; j <= n; j++){
int on_bit1 = (a[i] >> bit1) & 1;
int on_bit2 = (a[j] >> bit2) & 1;
int ways = 0;
for(int st0 = 0; st0 < 2; st0++){
for(int st1 = 0; st1 < 2; st1++){
for(int st2 = 0; st2 < 2; st2++){
int state_bit1 = (on_bit1 + st0 + st1) & 1;
int state_bit2 = (on_bit2 + st0 + st2) & 1;
if(state_bit1 && state_bit2){
int tmp = contrib(flip[0][i][j], st0);
tmp = mul(tmp, contrib(flip[1][i][j], st1));
tmp = mul(tmp, contrib(flip[2][i][j], st2));
ways = add(ways, tmp);
}
}
}
}
int unchanged = q;
for(int k = 0; k < 3; k++) unchanged -= flip[k][i][j];
assert(unchanged >= 0);
ways = mul(ways, pw2[unchanged]);
ways = mul(ways, (1 << bit1));
ways = mul(ways, (1 << bit2));
int same = 1 + (i != j);
int cover = mul(i, n - j + 1);
ways = mul(ways, mul(same, cover));
answer = add(answer, ways);
}
}
}
signed main(){
fastIO();
cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i];
cin >> q;
for(int i = 1; i <= q; i++) cin >> L[i] >> R[i] >> X[i];
pw2[0] = 1;
for(int i = 1; i <= q; i++) pw2[i] = mul(pw2[i-1], 2);
const int lg = 7;
for(int i = 0; i < lg; i++){
for(int j = 0; j < lg; j++){
add_contribution(i, j);
}
}
cout << answer;
}
# | 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... |