#include <cstdio>
#include <set>
#include <vector>
using namespace std;
const char iname[] = "gossips.in";
const char oname[] = "gossips.out";
const int maxn = 100005;
int n, m, start[maxn], end[maxn], k, a[maxn];
vector<int> E[maxn];
int q, x, y, i, t;
void bfs(int x) {
start[x] = ++k;
for (vector<int>::iterator it = E[x].begin(); it != E[x].end(); ++it)
bfs(*it);
end[x] = k;
}
set<int> A[maxn * 3], S[maxn * 3];
void update(int nod, int left, int right, int start, int finish, int value) {
A[nod].insert(value);
if (start <= left && right <= finish) {
S[nod].insert(value);
return;
}
int mid = (left + right) / 2;
if (start <= mid)
update(nod * 2, left, mid, start, finish, value);
if (mid < finish)
update(nod * 2 + 1, mid + 1, right, start, finish, value);
}
int query(int nod, int left, int right, int start, int finish, int begin, int end) {
set<int>::iterator it;
if ((it = S[nod].lower_bound(begin)) != S[nod].end())
if (*it <= end)
return 1;
if ((it = A[nod].lower_bound(begin)) == A[nod].end())
return 0;
if (*it > end)
return 0;
if (start <= left && right <= finish) {
if (*it <= end)
return 1;
return 0;
}
int mid = (left + right) / 2;
if (start <= mid)
if (query(nod * 2, left, mid, start, finish, begin, end))
return 1;
if (mid < finish)
return query(nod * 2 + 1, mid + 1, right ,start, finish, begin, end);
return 0;
}
int main() {
freopen(iname, "r", stdin);
freopen(oname, "w", stdout);
scanf("%d%d%d", &n, &m, &q);
while(m--) {
scanf("%d%d", &x, &y);
E[x].push_back(y);
a[y] = x;
}
for (i = 1; i <= n; ++i)
if (a[i] == 0)
bfs(i);
for (i = 1; i <= q; ++i) {
scanf("%d%d%d", &t, &x, &y);
if (t == 2)
update(1, 1, n, start[x], end[x], start[y]);
else {
/*if (x == y) {
printf("YES\n");
continue;
} */
x = query(1, 1, n, start[x], end[x], start[y], end[y]);
if (x == 1)
printf("YES\n");
else
printf("NO\n");
}
}
}