#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
#define skip cin>>ws;
#define vll vector
#define vi vector
#define vb vector
#define vpll vector<pair<ll,ll>>
#define vvll vector<vector>
#define vvi vector<vector>
#define pll pair<ll,ll>
#define vs vector
#define vvpll vector<vector<pair<ll, ll>>>
#define pb push_back
#define pob pop_back()
#define MOD (ll)(1e9)
#define MOD2 (ll)(998244353)
#define INF (ll)(1e18 + 5)
#define count1(n) __builtin_popcountll(n)
#define test ll t; cin>>t; while(t–)
#define enter(a) for(ll i=0;i<a.size();i++) cin>>a[i];
#define show(a) for(ll e: a) cout<<e<<" “; cout<<”\n";
using namespace std;
ll mo(ll a){ return a%MOD;}
ll po(ll x, ll y, ll p)
{
ll res = 1; x = x % p;
while (y > 0) { if (y & 1) res = (res * x) % p; y >>= 1; x = (x * x) % p; }
return res%p;
}
struct dsu
{
int n;
vll a, rank, siz;
void init(ll si)
{
n = si;
a.resize(n); rank.resize(n); siz.assign(n, 1);
for(ll i=0;i<n;i++)
{
rank[i] = 1; a[i] = i;
}
}
ll get(ll i)
{
return a[i] = ((i==a[i])?i:get(a[i]));
}
void unio(ll i, ll j)
{
ll x = get(i), y = get(j);
if(x==y) return;
if(rank[x]==rank[y]) rank[x]++;
if(rank[y]>rank[x]) swap(x, y);
a[y] = x;
siz[x] += siz[y];
}
ll get_size(ll i)
{
return siz[get(i)];
}
};
struct ed
{
ll x, y;
};
struct query{
string q;
ll x,y;
};
int main()
{
//freopen(“input.txt”,“r”,stdin),freopen(“output.txt”,“w”,stdout);
ios_base::sync_with_stdio(false);
cin.tie(NULL);
ll n,m,k;
cin>>n>>m>>k;
ed edge[m+1];
query qt[k+1];
for(ll i=0;i<m;i++)
{cin>>edge[i].x>>edge[i].y;}
for(ll i=0;i<k;i++){
cin>>qt[i].q>>qt[i].x>>qt[i].y;
}
dsu dt;
vector ans;
dt.init(n);
for(ll i=(k-1);i>=0;i–){
string qy=qt[i].q;
ll x=qt[i].x;
ll y=qt[i].y;
x–,y–;
if(qy==“ask”){
//cout<<x<<" "<<y<<endl;
if(dt.get(x)==dt.get(y)){
ans.pb(“YES”);
}else{
ans.pb(“NO”);
}}else{
dt.unio(x,y);
}
}
for(ll i=ans.size()-1;i>=0;i–){
cout<<ans[i]<<endl;
}
// cout<<ans<<"\n";
return 0;
}