#include <bits/stdc++.h>
using namespace std;
template<class T, class U>
void ckmin(T &a, U b)
{
if (a > b) a = b;
}
template<class T, class U>
void ckmax(T &a, U b)
{
if (a < b) a = b;
}
#define MP make_pair
#define PB push_back
#define LB lower_bound
#define UB upper_bound
#define fi first
#define se second
#define SZ(x) ((int) (x).size())
#define ALL(x) (x).begin(), (x).end()
#define FOR(i, a, b) for (auto i = (a); i < (b); i++)
#define FORD(i, a, b) for (auto i = (a) - 1; i >= (b); i--)
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<pii> vpi;
typedef vector<pll> vpl;
const int MAXN = 1013;
const int MAXV = 129;
const int MAXQ = 100013;
const int INF = 1000000007;
const int HALF = (INF + 1) >> 1;
int add(int a, int b)
{
a += b; if (a >= INF) a -= INF; return a;
}
int mul(int a, int b)
{
return (ll) a * b % INF;
}
int sub(int a, int b)
{
a -= b; if (a < 0) a += INF; return a;
}
int pwr(int a, int b)
{
int res = 1;
while(b > 0)
{
if (b & 1) res = mul(res, a);
b >>= 1;
a = mul(a, a);
}
return res;
}
int inv(int a)
{
return pwr(a, INF - 2);
}
int dvd(int a, int b)
{
return mul(a, inv(b));
}
int N, Q, V;
int arr[MAXN];
pair<pii, int> query[MAXN];
vi st[MAXN], en[MAXN];
int lt[MAXV], both[MAXV], rt[MAXV];
int ans;
int calc(int x, int y)
{
vi lb, mb, rb;
FORD(i, V, 0)
{
if (lt[i])
{
int w = i;
for (int x : lb) ckmin(w, w ^ x);
if (w) lb.PB(w);
}
if (both[i])
{
int w = i;
for (int x : mb) ckmin(w, w ^ x);
if (w) mb.PB(w);
}
if (rt[i])
{
int w = i;
for (int x : rb) ckmin(w, w ^ x);
if (w) rb.PB(w);
}
}
// for (int x : mb)
// {
// cerr << x << ' ';
// }
// cerr << endl;
int res = 0;
FOR(i, 0, (1 << SZ(mb)))
{
int el = 0, er = 0;
int val = 0;
FOR(j, 0, SZ(mb))
{
if (!(i & (1 << j))) continue;
val ^= mb[j];
}
FOR(j, 0, (1 << SZ(lb)))
{
int val1 = 0;
FOR(k, 0, SZ(lb))
{
if (!(j & (1 << k))) continue;
val1 ^= lb[k];
}
el = add(el, x ^ val ^ val1);
}
FOR(j, 0, (1 << SZ(rb)))
{
int val1 = 0;
FOR(k, 0, SZ(rb))
{
if (!(j & (1 << k))) continue;
val1 ^= rb[k];
}
er = add(er, y ^ val ^ val1);
}
int p = pwr(HALF, SZ(mb) + SZ(lb) + SZ(rb));
res = add(res, mul(mul(el, er), p));
//it
}
// cerr << "result " << res << endl;
return res;
}
int32_t main()
{
cout << fixed << setprecision(12);
cerr << fixed << setprecision(4);
ios_base::sync_with_stdio(false); cin.tie(0);
cin >> N;
FOR(i, 0, N)
{
cin >> arr[i];
ckmax(V, arr[i]);
}
cin >> Q;
FOR(i, 0, Q)
{
int l, r, x;
cin >> l >> r >> x; l--; r--;
query[i] = {{l, r}, x};
ckmax(V, x);
st[l].PB(i);
en[r].PB(i);
}
if (V == 0)
{
assert(false);
cout << "0\n";
return 0;
}
V = (1 << (32 - __builtin_clz(V - 1)));
// cerr << "V = " << V << endl;
//the last bit probably has smth to do w the fact that you only care about 7 vectors because basis blah blah blah crap.
FOR(i, 0, N)
{
fill(lt, lt + V, 0);
fill(both, both + V, 0);
fill(rt, rt + V, 0);
//it affects left only, both
FOR(j, 0, Q)
{
if (query[j].fi.fi <= i && query[j].fi.se >= i)
{
both[query[j].se]++;
}
}
int co = mul(i + 1, N - i);
// cerr << "solve " << i << ' ' << i << endl;
ans = add(ans, mul(co, calc(arr[i], arr[i])));
FOR(j, i + 1, N)
{
for (int q : en[j - 1])
{
if (query[q].fi.fi <= i)
{
both[query[q].se]--;
lt[query[q].se]++;
}
else
{
rt[query[q].se]--;
}
}
for (int q : st[j])
{
rt[query[q].se]++;
}
co = mul(2, mul(i + 1, N - j));
// cerr << "solve " << i << ' ' << j << " co = " << co << endl;
ans = add(ans, mul(co, calc(arr[i], arr[j])));
}
}
// cerr << "ans == " << ans << endl;
FOR(i, 0, Q)
{
ans = add(ans, ans);
}
cout << ans << '\n';
return 0;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
5 ms |
384 KB |
Output is correct |
2 |
Correct |
5 ms |
384 KB |
Output is correct |
3 |
Correct |
5 ms |
384 KB |
Output is correct |
4 |
Correct |
4 ms |
384 KB |
Output is correct |
5 |
Correct |
4 ms |
384 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
5 ms |
384 KB |
Output is correct |
2 |
Correct |
5 ms |
384 KB |
Output is correct |
3 |
Correct |
5 ms |
384 KB |
Output is correct |
4 |
Correct |
4 ms |
384 KB |
Output is correct |
5 |
Correct |
4 ms |
384 KB |
Output is correct |
6 |
Correct |
9 ms |
384 KB |
Output is correct |
7 |
Correct |
6 ms |
384 KB |
Output is correct |
8 |
Correct |
6 ms |
384 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
5 ms |
384 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
186 ms |
504 KB |
Output is correct |
2 |
Correct |
195 ms |
500 KB |
Output is correct |
3 |
Correct |
155 ms |
480 KB |
Output is correct |
4 |
Correct |
156 ms |
384 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
384 KB |
Output is correct |
2 |
Correct |
6 ms |
384 KB |
Output is correct |
3 |
Correct |
6 ms |
384 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
384 KB |
Output is correct |
2 |
Correct |
6 ms |
384 KB |
Output is correct |
3 |
Correct |
6 ms |
384 KB |
Output is correct |
4 |
Incorrect |
5 ms |
384 KB |
Output isn't correct |
5 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
5 ms |
384 KB |
Output is correct |
2 |
Correct |
5 ms |
384 KB |
Output is correct |
3 |
Correct |
5 ms |
384 KB |
Output is correct |
4 |
Correct |
4 ms |
384 KB |
Output is correct |
5 |
Correct |
4 ms |
384 KB |
Output is correct |
6 |
Correct |
9 ms |
384 KB |
Output is correct |
7 |
Correct |
6 ms |
384 KB |
Output is correct |
8 |
Correct |
6 ms |
384 KB |
Output is correct |
9 |
Correct |
6 ms |
384 KB |
Output is correct |
10 |
Correct |
6 ms |
384 KB |
Output is correct |
11 |
Correct |
6 ms |
384 KB |
Output is correct |
12 |
Correct |
1553 ms |
504 KB |
Output is correct |
13 |
Correct |
1566 ms |
444 KB |
Output is correct |
14 |
Correct |
30 ms |
384 KB |
Output is correct |
15 |
Correct |
380 ms |
384 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
5 ms |
384 KB |
Output is correct |
2 |
Correct |
5 ms |
384 KB |
Output is correct |
3 |
Correct |
5 ms |
384 KB |
Output is correct |
4 |
Correct |
4 ms |
384 KB |
Output is correct |
5 |
Correct |
4 ms |
384 KB |
Output is correct |
6 |
Correct |
9 ms |
384 KB |
Output is correct |
7 |
Correct |
6 ms |
384 KB |
Output is correct |
8 |
Correct |
6 ms |
384 KB |
Output is correct |
9 |
Correct |
6 ms |
384 KB |
Output is correct |
10 |
Correct |
6 ms |
384 KB |
Output is correct |
11 |
Correct |
6 ms |
384 KB |
Output is correct |
12 |
Incorrect |
5 ms |
384 KB |
Output isn't correct |
13 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
5 ms |
384 KB |
Output is correct |
2 |
Correct |
5 ms |
384 KB |
Output is correct |
3 |
Correct |
5 ms |
384 KB |
Output is correct |
4 |
Correct |
4 ms |
384 KB |
Output is correct |
5 |
Correct |
4 ms |
384 KB |
Output is correct |
6 |
Correct |
9 ms |
384 KB |
Output is correct |
7 |
Correct |
6 ms |
384 KB |
Output is correct |
8 |
Correct |
6 ms |
384 KB |
Output is correct |
9 |
Incorrect |
5 ms |
384 KB |
Output isn't correct |
10 |
Halted |
0 ms |
0 KB |
- |