Submission #1290400

#TimeUsernameProblemLanguageResultExecution timeMemory
1290400silentloopDigital Circuit (IOI22_circuit)C++20
0 / 100
1356 ms2162688 KiB
#include <bits/stdc++.h>
#define ll long long
#define sz(x) int(x.size())
#define forn(i, n) for (i = 0; i < n; i++)
#define all(x) x.begin(), x.end()
#define pb push_back
#define mp make_pair
#define fr first
#define se second
using namespace std;

const int MOD = 1000002022;
const int MAXN = 2e5 + 1;

vector<ll> grafo[MAXN];
ll lazy[MAXN];
pair<ll, ll> p[MAXN];
pair<ll, ll> rang[MAXN];

// En los comentarios p es el parametro del nodo

ll c01(pair<ll, ll> &a, pair<ll, ll> &b) // Cantidad de formas de obtener 0 si p es 1
{
  return (a.fr * b.fr) % MOD;
}

ll c02(pair<ll, ll> &a, pair<ll, ll> &b) // Cantidad de formas de obtener 0 si p es 2
{
  return (((a.fr * b.se) % MOD + (a.se * b.fr) % MOD) % MOD + c01(a, b)) % MOD;
}

ll c12(pair<ll, ll> &a, pair<ll, ll> &b) // Cantidad de formas de obtener 1 si p es 2
{
  return (a.se * b.se) % MOD;
}

ll c11(pair<ll, ll> &a, pair<ll, ll> &b) // Cantidad de formas de obtener 1 si p es 1
{
  return (((a.fr * b.se) % MOD + (a.se * b.fr) % MOD) % MOD + c12(a, b)) % MOD;
}

void init(int N, int M, std::vector<int> P, std::vector<int> A)
{
  ll i, j;
  for (i = 1; i < sz(P); i++)
    grafo[P[i]].pb(i);
  for (i = 0; i < sz(A); i++)
  {
    p[i + N] = {!A[i], A[i]};
    rang[i + N] = {i + N, i + N};
  }
  for (i = N - 1; i >= 0; i--)
  {
    ll X = grafo[i][0], Y = grafo[i][1];
    pair<ll, ll> x = p[X], y = p[Y];
    p[i] = {(c01(x, y) + c02(x, y)) % MOD, (c11(x, y) + c12(x, y)) % MOD};
    rang[i] = {min(rang[X].fr, rang[Y].fr), max(rang[X].se, rang[Y].se)};
  }
}

void prop(ll nod)
{
  ll X = grafo[nod][0], Y = grafo[nod][1];
  lazy[X] = (lazy[X] + 1) % 2;
  swap(p[X].fr, p[X].se);

  lazy[Y] = (lazy[Y] + 1) % 2;
  swap(p[Y].fr, p[Y].se);

  lazy[nod]=0;
}

void up(ll nod)
{
  ll X = grafo[nod][0], Y = grafo[nod][1];
  pair<ll, ll> x = p[X], y = p[Y];
  p[nod] = {(c01(x, y) + c02(x, y)) % MOD, (c11(x, y) + c12(x, y)) % MOD};
}

void update(ll l, ll r, ll nod)
{
  if (rang[nod].fr > r || rang[nod].se < l)
    return;
  if (rang[nod].fr >= l && rang[nod].se <= r)
  {
    lazy[nod] = (lazy[nod] + 1) % 2;
    swap(p[nod].fr, p[nod].se);
    return;
  }
  prop(nod);
  update(l, r, nod * 2);
  update(l, r, nod * 2 + 1);
  up(nod);
}

int count_ways(int L, int R)
{
  update(L, R, 0);
  return p[0].se;
}
#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...