#include<bits/stdc++.h>

using namespace std;
using ll = long long;

class Scc {
private:
    int n;
    vector<vector<int>> edge, rev;
    vector<int> post_order;
    vector<bool> seen0, seen1;
    vector<int> typea;         //type[i] := 頂点iの種類(番号のトポロジカルソート順)
    vector<vector<int>> new_edge; //comb[i] := type[i]からのびる辺の集合
    int ord;
    int type_num;

    void dfs0(int v) {
        if(seen0[v])return;
        seen0[v] = true;
        for(auto i : edge[v]) {
            dfs0(i);
        }
        post_order[v] = ord++;
    }

    void dfs1(int v, int typ) {
        if(seen1[v])return;
        seen1[v] = true;
        typea[v] = typ;
        for(auto i : rev[v]) {
            dfs1(i, typ);
        }
    }


public:


    int types(){return type_num;}
    int type(int vertex){return typea[vertex];}
    vector<int> dag(int vertex){return new_edge[vertex];}

    Scc(const vector<vector<int>>& _edge):edge(_edge) {
        n = edge.size();
        typea.resize(n), post_order.resize(n), seen0.resize(n), seen1.resize(n), rev.resize(n);
        ord = 0;
        for(int i = 0; i < n; i++)dfs0(i);
        for(int i = 0; i < n; i++) {
            for(auto j : edge[i])rev[j].push_back(i);
        }
        vector<int> dfs1_ord(n);
        for(int i = 0; i < n; i++)dfs1_ord[post_order[i]] = i;
        type_num = 0;
        for(int i = n - 1; i >= 0; i--)if(!seen1[dfs1_ord[i]])dfs1(dfs1_ord[i], type_num++);
    }
};


int main()
{
    int n, m;
    cin >> n >> m;
    vector<vector<int>> hen(n);
    for(int i = 0; i < m; i++) {
        int a, b;cin >> a >> b;
        hen[a].emplace_back(b);
    }
    Scc scc(hen); int q; cin >> q;
    for(int i = 0;  i< q; i++) {
        int a, b; cin >> a >> b;
        cout << (scc.type(a) == scc.type(b)) << endl;
    }

}

