Submission #1140253

#TimeUsernameProblemLanguageResultExecution timeMemory
1140253raphaelpRegions (IOI09_regions)C++20
100 / 100
4353 ms75168 KiB
#include <bits/stdc++.h>
using namespace std;
#define LSOne(S) ((S) & (-S))
class Fenwick
{
private:
    vector<int> ft;

public:
    Fenwick(int x) { ft.assign(x + 1, 0); }
    int PQ(int x)
    {
        x++;
        int sum = 0;
        for (; x < ft.size(); x += LSOne(x))
            sum += ft[x];
        return sum;
    }
    void update(int a, int b, int val)
    {
        for (; a; a -= LSOne(a))
            ft[a] -= val;
        for (; b; b -= LSOne(b))
            ft[b] += val;
    }
};
vector<int> dfs(int x, vector<vector<int>> &AR, vector<int> &deb, vector<int> &fin, int &cur, vector<vector<int>> &boss, vector<vector<int>> &empl, vector<int> &conv, vector<int> &current, vector<int> &reg)
{
    if (conv[reg[x]] != -1)
        current[conv[reg[x]]]++;
    for (int i = 0; i < boss.size(); i++)
    {
        if (i != conv[reg[x]])
            boss[i][reg[x]] += current[i];
    }
    deb[x] = cur++;
    vector<int> current2(boss.size());
    for (auto fils : AR[x])
    {
        vector<int> current3 = dfs(fils, AR, deb, fin, cur, boss, empl, conv, current, reg);
        for (int i = 0; i < boss.size(); i++)
        {
            current2[i] += current3[i];
        }
    }
    for (int i = 0; i < boss.size(); i++)
    {
        if (i != conv[reg[x]])
            empl[i][reg[x]] += current2[i];
    }
    if (conv[reg[x]] != -1)
    {
        current[conv[reg[x]]]--;
        current2[conv[reg[x]]]++;
    }
    fin[x] = cur;
    return current2;
}
int main()
{
    int N, R, Q;
    cin >> N >> R >> Q;
    vector<int> p(N), reg(N);
    vector<vector<int>> AR(N), Habs(R);
    for (int i = 0; i < N; i++)
    {
        if (i > 0)
        {
            cin >> p[i];
            p[i]--;
            AR[p[i]].push_back(i);
        }
        cin >> reg[i];
        reg[i]--;
        Habs[reg[i]].push_back(i);
    }
    Fenwick FT(N);
    vector<int> deb(N), fin(N), conv(R, -1);
    int bigs = 0;
    for (int i = 0; i < R; i++)
    {
        if (Habs[i].size() > 500)
        {
            conv[i] = bigs++;
        }
    }
    vector<vector<int>> boss(bigs, vector<int>(R)), empl(bigs, vector<int>(R));
    vector<int> current(bigs);
    int cur = 0;
    dfs(0, AR, deb, fin, cur, boss, empl, conv, current, reg);
    for (int i = 0; i < Q; i++)
    {
        int r1, r2;
        cin >> r1 >> r2;
        r1--, r2--;
        int ans = 0;
        if (conv[r1] != -1)
            ans = boss[conv[r1]][r2];
        else if (conv[r2] != -1)
            ans = empl[conv[r2]][r1];
        else
        {
            for (auto j : Habs[r1])
                FT.update(deb[j], fin[j], 1);
            for (auto j : Habs[r2])
                ans += FT.PQ(deb[j]);
            for (auto j : Habs[r1])
                FT.update(deb[j], fin[j], -1);
        }
        cout << ans << endl;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...