This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<fstream>
#include<vector>
#include<cstring>
#include "garden.h"
#include "gardenlib.h"
#define DIM 300005
using namespace std;
static int viz[2][DIM], dist[2][DIM], t[DIM], cic[DIM], nrcic[DIM], pos[DIM], viz2[DIM];
static pair<int, int> p[DIM][2];
static vector<int> v[DIM];
static void dfs(int nod, int t){
    viz[t][nod] = 1;
    for(int i = 0; i < v[nod].size(); i++){
        int vecin = v[nod][i];
        if(viz[t][vecin] == 0){
            dist[t][vecin] = 1 + dist[t][nod];
            dfs(vecin, t);
        }
    }
}
static void calcp(int i, int x, int y){
    if(p[x][0].first == 0){
        p[x][0] = make_pair(i, y);
    }
    else{
        if(p[x][1].first == 0){
            p[x][1] = make_pair(i, y);
        }
    }
}
static void calct(int x, pair<int, int> curr){
    if(p[ curr.second ][0].first == curr.first && p[ curr.second ][1].first != 0){
        t[x] = 2 * curr.second;
    }
    else{
        t[x] = 2 * curr.second - 1;
    }
}
void count_routes(int n, int m, int d, int w[][2], int q, int g[]){
    int i, x, k, j, sol, ii;
    d++;
    for(i = 0; i < m; i++){
        w[i][0]++;
        w[i][1]++;
        calcp(i + 1, w[i][0], w[i][1]);
        calcp(i + 1, w[i][1], w[i][0]);
    }
    for(i = 1; i <= n; i++){
        calct(2 * i - 1, p[i][0]);
        if(p[i][1].first != 0){
            calct(2 * i, p[i][1]);
        }
        else{
            t[2 * i] = 2 * i;
        }
    }
    k = 0;
    for(i = 1; i <= 2 * n; i++){
        v[ t[i] ].push_back(i);
        x = i;
        while(viz2[x] == 0){
            viz2[x] = 1;
            pos[x] = i;
            x = t[x];
        }
        if(pos[x] == i){
            k++;
            while(viz2[x] != 2){
                viz2[x] = 2;
                cic[x] = k;
                nrcic[k]++;
                x = t[x];
            }
        }
    }
    dfs(2 * d - 1, 0);
    dfs(2 * d, 1);
    for(i = 0; i < q; i++){
        sol = 0;
        for(x = 2 * d - 1, ii = 0; ii <= 1; ii++, x++){
            for(j = 1; j <= 2 * n; j += 2){
                if(cic[x] != 0){
                    if(viz[ii][j] == 1 && dist[ii][j] <= g[i] && (dist[ii][j] - g[i]) % nrcic[ cic[x] ] == 0){
                        sol++;
                    }
                }
                else{
                    if(viz[ii][j] == 1 && dist[ii][j] == g[i]){
                        sol++;
                    }
                }
            }
        }
        answer(sol);
    }
}
Compilation message (stderr)
garden.cpp: In function 'void dfs(int, int)':
garden.cpp:13:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i < v[nod].size(); 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... |