Submission #1235917

#TimeUsernameProblemLanguageResultExecution timeMemory
1235917Sir_Ahmed_ImranDigital Circuit (IOI22_circuit)C++17
2 / 100
3071 ms5680 KiB
#include "circuit.h"
#include <bits/stdc++.h>
using namespace std;
#define MAXN 100001
#define nl '\n'
#define ff first
#define ss second
#define ll long long
#define ld long double
#define terminator main
#define pll pair<ll,ll>
#define add insert
#define append push_back
#define pii pair<int,int>
#define all(x) (x).begin(),(x).end()
#define mid ((s + e) / 2)
#define rc (2 * v + 1)
#define lc (2 * v)

const int mod = 1000002022;

int add(int a, int b){
    return (a + b) % mod;
}

int mul(int a, int b){
    return (1ll * a * b) % mod;
}

int n, m;
int p[MAXN];
int q[MAXN];
int dp[MAXN];
int val[MAXN];
vector<int> z;
int lazy[4 * MAXN];
vector<int> a[MAXN];
int seg[4 * MAXN][2];

void built(int v = 1, int s = 0, int e = m){
    if(e - s == 1){
        seg[v][z[s]] = val[s + n];
        return;
    }
    built(lc, s, mid);
    built(rc, mid, e);
    seg[v][0] = add(seg[lc][0], seg[rc][0]);
    seg[v][1] = add(seg[lc][1], seg[rc][1]);
}

void push(int v){
    if(lazy[v] % 2)
        swap(seg[v][0], seg[v][1]);
    if(rc < 4 * MAXN){
        lazy[rc] += lazy[v];
        lazy[lc] += lazy[v];
    }
    lazy[v] = 0;
}

void update(int l, int r, int v = 1, int s = 0, int e = m){
    push(v);
    if(r <= s || e <= l) return;
    if(l <= s && e <= r){
        lazy[v]++;
        push(v);
        return;
    }
    update(l, r, lc, s, mid);
    update(l, r, rc, mid, e);
    seg[v][0] = add(seg[lc][0], seg[rc][0]);
    seg[v][1] = add(seg[lc][1], seg[rc][1]);
}

void dfs(int v){
    dp[v] = 1;
    for(auto & u : a[v]){
        dfs(u);
        p[u] = dp[v];
        dp[v] = mul(dp[v], dp[u]);
    }
    if(!a[v].empty())
        dp[v] = mul(dp[v], a[v].size());
    reverse(all(a[v]));
    int x = 1;
    for(auto & u : a[v]){
        dfs(u);
        q[u] = x;
        x = mul(x, dp[u]);
        val[u] = mul(p[u], q[u]);
    }
}

void init(int N, int M, vector<int> P, vector<int> A) {
    n = N, m = M, z = A;
    for(int i = 1; i < P.size(); i++)
        a[P[i]].append(i);
    dfs(0);
    for(int i = val[0] = 1; i < P.size(); i++)
        val[i] = mul(val[i], val[P[i]]);
    built();
}

int count_ways(int l, int r){
    update(l - n, r - n + 1);
    return seg[1][1];
}
#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...