#include <bits/stdc++.h>
using namespace std;
int n;
int par[200002];
int type[200002];
int p[20][200002];
int d[200002];
int d1[200002];
int d2[200002];
vector<pair<int, int> > g[200002];
int c[200002];
int getp(int v) { return c[v] == v ? v : c[v] = getp(c[v]); }
inline void merge(int v1, int v2) {
  v1 = getp(v1);
  v2 = getp(v2);
  if (rand() & 1)
    c[v1] = v2;
  else
    c[v2] = v1;
}
void dfs(int v, int dep = 0, int dep1 = 0, int dep2 = 0) {
  d[v] = dep;
  d1[v] = dep1;
  d2[v] = dep2;
  int pr = v;
  if (par[v] != -1) {
    merge(v, par[v]);
    pr = par[v];
  }
  p[0][v] = pr;
  for (int i = 1; i < 20; ++i) p[i][v] = p[i - 1][p[i - 1][v]];
  for (const auto& t : g[v]) {
    dfs(t.first, dep + 1, dep1 + !t.second, dep2 + t.second);
  }
}
inline int lca(int v1, int v2) {
  if (d[v1] < d[v2]) swap(v1, v2);
  for (int i = 20 - 1; i >= 0; --i) {
    if (d[p[i][v1]] >= d[v2]) {
      v1 = p[i][v1];
    }
  }
  if (v1 == v2) return v1;
  for (int i = 20 - 1; i >= 0; --i) {
    if (p[i][v1] != p[i][v2]) {
      v1 = p[i][v1];
      v2 = p[i][v2];
    }
  }
  return p[0][v1];
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n; ++i) {
    c[i] = i;
    scanf("%d%d", &par[i], &type[i]);
    if (par[i] != -1) {
      --par[i];
      g[par[i]].push_back({i, type[i]});
    }
  }
  for (int i = 0; i < n; ++i) {
    if (par[i] != -1) continue;
    dfs(i);
  }
  int m;
  scanf("%d", &m);
  for (int i = 0; i < m; ++i) {
    int t1, t2, t3;
    scanf("%d%d%d", &t1, &t2, &t3);
    --t2, --t3;
    if (t2 == t3 || getp(t2) != getp(t3)) {
      puts("NO");
      continue;
    }
    int lcav = lca(t2, t3);
    if (t1 == 1) {
      puts(lcav == t2 && d2[t3] == d2[t2] ? "YES" : "NO");
    } else {
      puts(d2[lcav] == d2[t2] && d1[lcav] == d1[t3] && lcav != t3 ? "YES"
                                                                  : "NO");
    }
  }
  return 0;
}
