Submission #1140251

#TimeUsernameProblemLanguageResultExecution timeMemory
1140251raphaelpRegions (IOI09_regions)C++20
55 / 100
8051 ms32036 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;
    }
};
void dfs(int x, vector<vector<int>> &AR, vector<int> &deb, vector<int> &fin, int &cur)
{
    deb[x] = cur++;
    for (auto fils : AR[x])
    {
        dfs(fils, AR, deb, fin, cur);
    }
    fin[x] = cur;
}
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);
    int cur = 0;
    dfs(0, AR, deb, fin, cur);
    for (int i = 0; i < Q; i++)
    {
        int r1, r2;
        cin >> r1 >> r2;
        r1--, r2--;
        int ans = 0;
        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...