Submission #165675

#TimeUsernameProblemLanguageResultExecution timeMemory
165675nvmdavaRegions (IOI09_regions)C++17
100 / 100
4298 ms34888 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ff first
#define ss second
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#define INF 0x3f3f3f3f3f3f3f3f
#define MOD 1000000007
#define N 200005
#define S 500

int h[N], p[N], ho[N];
vector<int> ch[N];
int le[N], ri[N];
int cntr;

int rs[25005];
vector<int> rid[25005];
vector<pair<pair<int, int>, int> > rrange[25005];

void dfs(int v){
    int t = ++cntr;
    rid[h[v]].push_back(cntr);
    ho[cntr] = h[v];
    for(auto& x : ch[v])
        dfs(x);
    ri[t] = cntr;
}

map<int, int> dif;

void addrange(int v){
    dif.clear();
    for(auto& x : rid[v]){
        ++dif[x];
        --dif[ri[x] + 1];
    }

    int now = 0, le = -1;

    for(auto& x : dif){
        if(now != 0){
            rrange[v].push_back({{le, x.ff - 1}, now});
        }
        now += x.ss;
        le = x.ff;
    }
}

map<int, int> cache;

int main(){
    // ios_base::sync_with_stdio(0);
    // cin.tie(0);
    // cout.tie(0);

    int n, r, q;
    scanf("%d%d%d%d", &n, &r, &q, &h[1]);
    ++rs[h[1]];
    for(int i = 2; i <= n; ++i){
        scanf("%d%d", &p[i], &h[i]);
        ++rs[h[i]];
        ch[p[i]].push_back(i);
    }

    dfs(1);
    cntr = 0;
    for(int i = 1; i <= r; ++i)
        addrange(i);
    


    while(q--){
        int r1, r2;
        scanf("%d%d", &r1, &r2);
        auto it = cache.find(r1 * 25000 + r2);
        if(it != cache.end()){
            printf("%d\n", it -> ss);
            fflush(stdout);
            continue;
        }
        int ans = 0;
        // if((rs[r1] >= S && rs[r2] >= S) || (rs[r1] < S && rs[r2] < S)){
            int i = 0;
            for(auto& x : rid[r2]){
                while(rrange[r1].size() > i && rrange[r1][i].ff.ss < x)
                    ++i;
                if(rrange[r1].size() == i)
                    break;
                if(rrange[r1].size() != i && rrange[r1][i].ff.ff <= x)
                    ans += rrange[r1][i].ss;
            }
        // }
        cache[r1 * 25000 + r2] = ans;
        printf("%d\n", ans);
        fflush(stdout);
    }
}

Compilation message (stderr)

regions.cpp: In function 'int main()':
regions.cpp:86:41: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                 while(rrange[r1].size() > i && rrange[r1][i].ff.ss < x)
                       ~~~~~~~~~~~~~~~~~~^~~
regions.cpp:88:38: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                 if(rrange[r1].size() == i)
                    ~~~~~~~~~~~~~~~~~~^~~~
regions.cpp:90:38: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                 if(rrange[r1].size() != i && rrange[r1][i].ff.ff <= x)
                    ~~~~~~~~~~~~~~~~~~^~~~
regions.cpp:58:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d%d%d", &n, &r, &q, &h[1]);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
regions.cpp:61:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d", &p[i], &h[i]);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~
regions.cpp:75:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d", &r1, &r2);
         ~~~~~^~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...