#include "circuit.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using lld = long double;
using ii = pair<int,int>;
using pll = pair<ll, ll>;
using vi = vector<int>;
using vll = vector<ll>;
using vii = vector<ii>;
using vpll = vector<pll>;
using vlld = vector<lld>;
// #define endl '\n'
#define all(x) x.begin(),x.end()
#define lsb(x) x&(-x)
#define gcd(a,b) __gcd(a,b)
#define sz(x) (int)x.size()
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define fls cout.flush()
#define fore(i,l,r) for(auto i=l;i<r;i++)
#define fo(i,n) fore(i,0,n)
#define forex(i,r,l) for(auto i=r; i>=l;i--)
#define ffo(i,n) forex(i,n-1,0)
bool cmin(ll &a, ll b) { if(b<a){a=b;return 1;}return 0; }
bool cmax(ll &a, ll b) { if(b>a){a=b;return 1;}return 0; }
void valid(ll in) { cout<<((in)?"Yes\n":"No\n"); }
ll lcm(ll a, ll b) { return (a/gcd(a,b))*b; }
ll gauss(ll n) { return (n*(n+1))/2; }
const int mod = 1e9 + 2022;
struct SegTree {
struct Node {
ll a, b;
Node ( ) { }
Node (ll a, ll b): a(a), b(b) { }
Node operator+ (const Node &o) {
Node r(0, 0);
// r.a = 1, dp[1], tener un 1 aqui
// parametro 1
(r.b += b*o.b) %= mod;
(r.a += (a + b) * (o.a + o.b)) %= mod;
(r.a -= (b*o.b)%mod - mod) %= mod;
// parametro 2
(r.a += a*o.a) %= mod;
(r.b += (a + b) * (o.a + o.b)) %= mod;
(r.b -= (a*o.a)%mod - mod) %= mod;
return r;
}
};
Node IDEM = {0, 0};
vector<Node> st;
vll lz;
ll n;
SegTree ( ) { }
SegTree (ll n): st(4*n+4, IDEM), lz(4*n+4, 0), n(n) { }
void prop (ll id, ll l, ll r) {
if (lz[id] == 0) return;
swap(st[id].a, st[id].b);
if (l < r) {
lz[id*2+1] ^= 1;
lz[id*2+2] ^= 1;
}
lz[id] = 0;
}
void update (ll l, ll r) { update(0, 0, n - 1, l, r); }
void update (ll id, ll l, ll r, ll i, ll j) {
prop(id, l, r);
if (r < i || j < l) return;
if (i <= l && r <= j) {
lz[id] ^= 1;
prop(id, l, r);
return;
}
ll m = (l+r)/2;
update(id*2+1, l, m, i, j);
update(id*2+2, m+1, r, i, j);
st[id] = st[id*2+1] + st[id*2+2];
}
void build (ll id, ll l, ll r, vll &a) {
if (l == r) {
if (a[l] == 0) {
st[id].b = 1;
st[id].a = 0;
} else {
st[id].b = 0;
st[id].a = 1;
}
return;
}
ll m = (l+r)/2;
build(id*2+1, l, m, a);
build(id*2+2, m+1, r, a);
st[id] = st[id*2+1] + st[id*2+2];
}
};
const int N = 2e5 + 7;
vector<vll> graph;
ll p[N], a[N], n, m, dp[N][2];
SegTree st;
/*
dp[u][0] = #acomodos de parametros de los del subarbol de u para que u
sea 0
dp[u][1] = lo mismo para que u sea 1
*/
void init(int N, int M, std::vector<int> P, std::vector<int> A) {
n = N;
m = M;
graph = vector<vll>(N+M);
fore (i, 1, N+M) graph[P[i]].pb(i);
fo (i, N+M) p[i] = P[i];
fore (i, N, N+M) a[i] = A[i-N];
st = SegTree(M);
vll dx;
fore (i, n, n+m) dx.pb(a[i]);
st.build(0, 0, m-1, dx);
}
int count_ways(int l, int r) {
l -= n, r -= n;
st.update(l, r);
return st.st[0].a;
}
# | 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... |