#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[MAXQ];
vi st[MAXN], en[MAXN];
int lt[MAXV], rt[MAXV], both[MAXV];
int lval, rval;
int ans;
int calc(int x, int y)
{
lval = 0; rval = 0;
vi mb;
FORD(i, (1 << V), 0)
{
if (lt[i]) lval |= i;
if (rt[i]) rval |= i;
if (both[i])
{
int w = i;
for (int x : mb) ckmin(w, w ^ x);
if (w) mb.PB(w);
}
}
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, V)
{
if (lval & (1 << j))
{
el = add(el, mul(HALF, (1 << j)));
}
else
{
bool b = ((x ^ val) & (1 << j));
if (b) el = add(el, (1 << j));
}
if (rval & (1 << j))
{
er = add(er, mul(HALF, (1 << j)));
}
else
{
bool b = ((y ^ val) & (1 << j));
if (b) er = add(er, (1 << j));
}
}
res = add(res, mul(el, er));
}
res = mul(res, pwr(HALF, SZ(mb)));
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);
}
V = (32 - __builtin_clz(V));
// 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 + (1 << V), 0);
fill(both, both + (1 << V), 0);
fill(rt, rt + (1 << V), 0);
//for i...N + 1 you have some shit happening left only.
//it affects left only, both
FOR(j, 0, Q)
{
if (query[j].fi.fi <= i && query[j].fi.se >= i)
{
lt[query[j].se]++;
}
}
FORD(j, N, i)
{
for (int q : en[j])
{
if (query[q].fi.fi <= i)
{
lt[query[q].se]--;
both[query[q].se]++;
}
else
{
rt[query[q].se]++;
}
}
int co = mul(i + 1, N - j);
if (i != j) co = add(co, co);
// cerr << "solve " << i << ' ' << j << " co = " << co << endl;
ans = add(ans, mul(co, calc(arr[i], arr[j])));
for (int q : st[j])
{
rt[query[q].se]--;
}
}
}
// cerr << "ans == " << ans << endl;
FOR(i, 0, Q)
{
ans = add(ans, ans);
}
cout << ans << '\n';
return 0;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
4 ms |
384 KB |
Output is correct |
2 |
Correct |
4 ms |
384 KB |
Output is correct |
3 |
Correct |
5 ms |
384 KB |
Output is correct |
4 |
Correct |
5 ms |
384 KB |
Output is correct |
5 |
Correct |
5 ms |
384 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
4 ms |
384 KB |
Output is correct |
2 |
Correct |
4 ms |
384 KB |
Output is correct |
3 |
Correct |
5 ms |
384 KB |
Output is correct |
4 |
Correct |
5 ms |
384 KB |
Output is correct |
5 |
Correct |
5 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 |
7 ms |
384 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
196 ms |
2748 KB |
Output is correct |
2 |
Correct |
19 ms |
640 KB |
Output is correct |
3 |
Correct |
6 ms |
384 KB |
Output is correct |
4 |
Correct |
5 ms |
384 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
180 ms |
384 KB |
Output is correct |
2 |
Correct |
177 ms |
504 KB |
Output is correct |
3 |
Correct |
161 ms |
384 KB |
Output is correct |
4 |
Correct |
167 ms |
384 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
5 ms |
512 KB |
Output is correct |
2 |
Correct |
5 ms |
384 KB |
Output is correct |
3 |
Correct |
5 ms |
384 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
5 ms |
512 KB |
Output is correct |
2 |
Correct |
5 ms |
384 KB |
Output is correct |
3 |
Correct |
5 ms |
384 KB |
Output is correct |
4 |
Correct |
9 ms |
512 KB |
Output is correct |
5 |
Correct |
9 ms |
512 KB |
Output is correct |
6 |
Correct |
9 ms |
512 KB |
Output is correct |
7 |
Correct |
9 ms |
512 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
4 ms |
384 KB |
Output is correct |
2 |
Correct |
4 ms |
384 KB |
Output is correct |
3 |
Correct |
5 ms |
384 KB |
Output is correct |
4 |
Correct |
5 ms |
384 KB |
Output is correct |
5 |
Correct |
5 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 |
7 ms |
384 KB |
Output is correct |
9 |
Correct |
5 ms |
512 KB |
Output is correct |
10 |
Correct |
5 ms |
384 KB |
Output is correct |
11 |
Correct |
5 ms |
384 KB |
Output is correct |
12 |
Correct |
55 ms |
384 KB |
Output is correct |
13 |
Correct |
57 ms |
384 KB |
Output is correct |
14 |
Correct |
10 ms |
384 KB |
Output is correct |
15 |
Correct |
37 ms |
384 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
4 ms |
384 KB |
Output is correct |
2 |
Correct |
4 ms |
384 KB |
Output is correct |
3 |
Correct |
5 ms |
384 KB |
Output is correct |
4 |
Correct |
5 ms |
384 KB |
Output is correct |
5 |
Correct |
5 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 |
7 ms |
384 KB |
Output is correct |
9 |
Correct |
5 ms |
512 KB |
Output is correct |
10 |
Correct |
5 ms |
384 KB |
Output is correct |
11 |
Correct |
5 ms |
384 KB |
Output is correct |
12 |
Correct |
9 ms |
512 KB |
Output is correct |
13 |
Correct |
9 ms |
512 KB |
Output is correct |
14 |
Correct |
9 ms |
512 KB |
Output is correct |
15 |
Correct |
9 ms |
512 KB |
Output is correct |
16 |
Correct |
55 ms |
384 KB |
Output is correct |
17 |
Correct |
57 ms |
384 KB |
Output is correct |
18 |
Correct |
10 ms |
384 KB |
Output is correct |
19 |
Correct |
37 ms |
384 KB |
Output is correct |
20 |
Execution timed out |
2081 ms |
2808 KB |
Time limit exceeded |
21 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
4 ms |
384 KB |
Output is correct |
2 |
Correct |
4 ms |
384 KB |
Output is correct |
3 |
Correct |
5 ms |
384 KB |
Output is correct |
4 |
Correct |
5 ms |
384 KB |
Output is correct |
5 |
Correct |
5 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 |
7 ms |
384 KB |
Output is correct |
9 |
Correct |
196 ms |
2748 KB |
Output is correct |
10 |
Correct |
19 ms |
640 KB |
Output is correct |
11 |
Correct |
6 ms |
384 KB |
Output is correct |
12 |
Correct |
5 ms |
384 KB |
Output is correct |
13 |
Correct |
180 ms |
384 KB |
Output is correct |
14 |
Correct |
177 ms |
504 KB |
Output is correct |
15 |
Correct |
161 ms |
384 KB |
Output is correct |
16 |
Correct |
167 ms |
384 KB |
Output is correct |
17 |
Correct |
5 ms |
512 KB |
Output is correct |
18 |
Correct |
5 ms |
384 KB |
Output is correct |
19 |
Correct |
5 ms |
384 KB |
Output is correct |
20 |
Correct |
9 ms |
512 KB |
Output is correct |
21 |
Correct |
9 ms |
512 KB |
Output is correct |
22 |
Correct |
9 ms |
512 KB |
Output is correct |
23 |
Correct |
9 ms |
512 KB |
Output is correct |
24 |
Correct |
55 ms |
384 KB |
Output is correct |
25 |
Correct |
57 ms |
384 KB |
Output is correct |
26 |
Correct |
10 ms |
384 KB |
Output is correct |
27 |
Correct |
37 ms |
384 KB |
Output is correct |
28 |
Execution timed out |
2081 ms |
2808 KB |
Time limit exceeded |
29 |
Halted |
0 ms |
0 KB |
- |