Submission #525628

#TimeUsernameProblemLanguageResultExecution timeMemory
525628Aldas25Regions (IOI09_regions)C++14
29 / 100
1274 ms31792 KiB
#include <bits/stdc++.h>

using namespace std;

#define FAST_IO ios_base::sync_with_stdio(0); cin.tie(0)
#define FOR(i, a, b) for(int i = (a); i <= (b); i++)
#define REP(n) FOR(O, 1, (n))
#define pb push_back
#define f first
#define s second
typedef long double ld;
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<pii> vii;
//mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

const int MAXN = 250100, MAXK = 20;
const ll MOD = 1e9+7;

const ll C = 500;
const ll c = 0;

int n, r, q;
int h[MAXN];
int regSz[MAXN];
bool bgReg[MAXN];
vi adj[MAXN];
ll pref[25100];
int regToId[MAXN];
int idToReg[MAXN];
int tin[MAXN], tout[MAXN];
int crT = 0;

ll ans1[C][25100];
ll ans2[C][25100];

void dfs (int v, int p = -1) {
    tin[v] = ++crT;

    FOR(i, 0, C-1) {
        ans1[i][h[v]] += pref[idToReg[i]];
        //ans2[i][h[v]] += pref[h[v]];
    }

    if (bgReg[h[v]]) {
        FOR(i, 1, r)
            ans2[regToId[h[v]]][i] += pref[i];
    }

    pref[h[v]]++;

    for (int u : adj[v]) {
        dfs (u, v);
    }

    pref[h[v]]--;

    tout[v] = crT;
}

bool isAnc (int a, int b) {
    return (tin[a] <= tin[b] && tout[b] <= tout[a]);
}


ll r1Big (int r1, int r2) {
    return ans1[regToId[r1]][r2];
}

ll r2Big (int r1, int r2) {
    return ans2[regToId[r2]][r1];
}

int main()
{
    FAST_IO;

    cin >> n >> r >> q;
    cin >> h[1];
    FOR(i, 2, n) {
        int pr; cin >> pr;
        adj[pr].pb(i);
        cin >> h[i];

    }

    FOR(i, 1, n) regSz[h[i]]++;
    int lstId = 0;
    FOR(i, 1, r) {
        bgReg[i] = (regSz[i] > c);

        if (bgReg[i]) {
            regToId[i] = ++lstId;
            idToReg[lstId] = i;
        }

       // cout << " i = " << i << " regSz = " << regSz[i] << " bg = " << bgReg[i] << endl;
       // if (bgReg[i]) cout << "     regToId[i]=" << regToId[i] << endl;
    }

    dfs(1);

    REP(q) {
        int r1, r2;
        cin >> r1 >> r2;
        if(bgReg[r1])
            cout << r1Big(r1, r2) << endl;
        else if (bgReg[r2])
            cout << r2Big(r1, r2) << endl;
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...