#include "garden.h"
#include "gardenlib.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define fi first
#define se second
#define pb push_back
#define vi vector<int>
#define vl vector<ll>
#define pi pair<int, int>
#define pl pair<ll,ll>
#define all(x) (x).begin(),(x).end()
const int maxn=1.5e5;
vector<vi> graph(maxn);
map<pi,pi> nxt;
map<pi,vector<pi>> prv;
map<pi,int> dst;
void count_routes(int n, int m, int p, int r[][2], int qq, int g[]) {
    vi ans(qq,0);
    for (int i=0; i<m; i++) {
        graph[r[i][0]].pb(r[i][1]);
        graph[r[i][1]].pb(r[i][0]);
    }
    for (int i=0; i<n; i++) {
        if (graph[i].size()==1) {
            graph[i].pb(graph[i][0]);
        }
    }
    for (int i=0; i<n; i++) {
        nxt[{i,graph[i][0]}]={graph[i][1],(i==graph[graph[i][1]][0] ? i : graph[graph[i][1]][1])};
        prv[{graph[i][1],(i==graph[graph[i][1]][0] ? i : graph[graph[i][1]][1])}].pb({i,graph[i][0]}); 
        if (graph[i][0]!=graph[i][1]) {
            nxt[{i,graph[i][1]}]={graph[i][0],(i==graph[graph[i][0]][0] ? i : graph[graph[i][0]][1])};
            prv[{graph[i][0],(i==graph[graph[i][0]][0] ? i : graph[graph[i][0]][1])}].pb({i,graph[i][1]});
        }
    }
    queue<pi> q;
    q.push({p,graph[p][0]});
    while (q.size()) {
        pi t=q.front();
        q.pop();
        for (auto to:prv[t]) {
            if (dst[to]==0) {
                dst[to]=dst[t]+1;
                q.push(to);
            }
        }
    }
    if (dst[{p,graph[p][0]}]) {
        int l1=dst[{p,graph[p][0]}];
        dst[{p,graph[p][0]}]=0;
        vector<vi> f(l1);
        for (auto [t,tdst]:dst) {
            if (t.se==graph[t.fi][1]) {
                f[tdst%l1].pb(tdst);
            }
        }
        for (int i=0; i<l1; i++) {
            sort(all(f[i]));
        }
        for (int i=0; i<qq; i++) {
            ans[i]+=lower_bound(all(f[g[i]%l1]),g[i]+1)-f[g[i]%l1].begin();
        }
    }
    else {
        map<int,int> add;
        for (auto [t,tdst]:dst) {
            if (t.se==graph[t.fi][1]) {
                add[tdst]++;
            }
        }
        for (int i=0; i<qq; i++) {
            ans[i]+=add[g[i]];
        }
    }
    dst.clear();
    if (graph[p][0]!=graph[p][1]) {
        queue<pi> q;
        q.push({p,graph[p][1]});
        while (q.size()) {
            pi t=q.front();
            q.pop();
            for (auto to:prv[t]) {
                if (dst[to]==0) {
                    dst[to]=dst[t]+1;
                    q.push(to);
                }
            }
        }
        if (dst[{p,graph[p][1]}]) {
            int l1=dst[{p,graph[p][1]}];
            dst[{p,graph[p][1]}]=0;
            vector<vi> f(l1);
            for (auto [t,tdst]:dst) {
                if (t.se==graph[t.fi][1]) {
                    f[tdst%l1].pb(tdst);
                }
            }
            for (int i=0; i<l1; i++) {
                sort(all(f[i]));
            }
            for (int i=0; i<qq; i++) {
                ans[i]+=lower_bound(all(f[g[i]%l1]),g[i]+1)-f[g[i]%l1].begin();
            }
        }
        else {
            map<int,int> add;
            for (auto [t,tdst]:dst) {
                if (t.se==graph[t.fi][1]) {
                    add[tdst]++;
                }
            }
            for (int i=0; i<qq; i++) {
                ans[i]+=add[g[i]];
            }
        }
    }
    for (int i=0; i<qq; i++) {
        answer(ans[i]);
    }
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |