#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10,M = 7e5+10;
int n,m,q,limit;
vector<int> bian[N];
set<pair<int,int> > ext;
int cnt[N];
pair<int,int> uo(int u,int v){
if(u > v)swap(u,v);
return make_pair(u,v);
}
pair<int,int> op1[N];
vector<pair<int,int> > op2[N];
int ans1[N],ans2[N];
int ty1,ty2;
struct{
bool type;
int pos,act;
} idx[N];
map<pair<int,int>,int> mp,mp1;
bitset<200010> point[50000];
int ps[N*2],pnt,pps[N];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m>>q;
limit = sqrt((long double)m/q * n/32/log2(m));
for(int i = 1;i<=m;i++){
int u,v;
cin>>u>>v;
bian[u].push_back(v);
bian[v].push_back(u);
cnt[u]++,cnt[v]++;
ext.insert(uo(u,v));
}
for(int i = 1;i<=q;i++){
int u,v;
cin>>u>>v;
int act = cnt[u];
if(cnt[u] > cnt[v]){
swap(u,v);
}
if(cnt[u] > limit){
idx[i].type = true;
idx[i].act = act - ext.count(uo(u,v));
if(mp.count(make_pair(u,v))){
idx[i].pos = mp[make_pair(u,v)];
continue;
}
op1[++ty1] = make_pair(u,v);
ps[++pnt] = u;
ps[++pnt] = v;
idx[i].pos = ty1;
mp[make_pair(u,v)] = ty1;
}else{
idx[i].type = false;
idx[i].act = act;
if(mp1.count(make_pair(u,v))){
idx[i].pos = mp1[make_pair(u,v)];
continue;
}
op2[u].push_back(make_pair(v,++ty2));
idx[i].pos = ty2;
mp1[make_pair(u,v)] = ty2;
}
}
sort(ps+1,ps+1+pnt);
int tot = unique(ps+1,ps+1+pnt) - ps - 1;
for(int i = 1;i<=tot;i++){
pps[ps[i]] = i;
}
for(int i = 1;i<=n;i++){
for(int j = 1;j<=tot;j++){
if(ext.count(uo(i,ps[j]))){
point[j][i] = 1;
}
}
}
for(int i = 1;i<=ty1;i++){
ans1[i] = -(point[pps[op1[i].first]] & point[pps[op1[i].second]]).count();
}
for(int i = 1;i<=n;i++){
for(pair<int,int> o2 : op2[i]){
int at = o2.second,g = o2.first;
for(int v : bian[i]){
if(v == g || ext.count(uo(v,g))){
ans2[at]--;
}
}
}
}
for(int i = 1;i<=q;i++){
if(idx[i].type){
cout<<idx[i].act + ans1[idx[i].pos]<<'\n';
}else{
cout<<idx[i].act + ans2[idx[i].pos]<<'\n';
}
}
}