#pragma GCC target("avx2") #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #include using namespace std; using ll = long long; using vl = vector; using vvl = vector; using vvvl = vector; using vi = vector; using vvi = vector; #define rep(i, n) for (int i = 0; i < n; i++) #define all(x) x.begin(), x.end() constexpr ll dx[] = {1, 0, -1, 0, 1, -1, -1, 1}; constexpr ll dy[] = {0, 1, 0, -1, 1, 1, -1, -1}; struct Init { Init() { ios::sync_with_stdio(0); cin.tie(0); cout << fixed << setprecision(15); } } init; template ostream& operator<<(ostream& os, const pair& pair_var) { os << "(" << pair_var.first << ", " << pair_var.second << ")"; return os; } template ostream& operator<<(ostream& os, const vector& vec) { os << "["; rep(i, vec.size()) { os << vec[i]; if (i != vec.size() - 1) os << ", "; } os << "]"; return os; } template ostream& operator<<(ostream& os, const vector>& vec) { os << "["; rep(i, vec.size()) { os << vec[i]; if (i != vec.size() - 1) os << ", "; } os << "]"; return os; } #include using namespace atcoder; using mint = modint998244353; constexpr int BLOCK_SIZE = 500; vector> cache = {}; vector> items; int getArrM(int x, int idx) { vector res = cache[x / BLOCK_SIZE]; for (int i = x / BLOCK_SIZE * BLOCK_SIZE; i < x; i++) { swap(res[items[i].first - 1], res[items[i].second - 1]); } return res[idx]; }; int main() { int n, m, q; cin >> n >> m >> q; items.resize(m); rep(i, m) cin >> items[i].first >> items[i].second; vector last(n); rep(i, n) last[i] = i; rep(i, m) { if (i % BLOCK_SIZE == 0) { cache.emplace_back(last); } swap(last[items[i].first - 1], last[items[i].second - 1]); } vvi db(60, vi(n)); rep(i, n) db[0][i] = last[i]; rep(k, 59) { rep(i, n) { db[k + 1][i] = db[k][db[k][i]]; } } rep(i, q) { ll t, x; cin >> t >> x; int rest = t % m; int now = (t - rest) / m; int pos = getArrM(rest, x - 1); rep(i, min(60, (int)logl(t) + 2)) { if (now & 1) { pos = db[i][pos]; } now >>= 1; } cout << pos + 1 << endl; } return 0; }