一段题解,没看懂
#pragma GCC optimize(3)
#include <bits/stdc++.h>
using namespace std ;
#define rep(i, a, b) for (register int i = a; i <= b; i++)
#define per(i, a, b) for (register int i = a; i >= b; i--)
const int N = 200010 ;
int n, m, q ;
int bl[N], pos[N], neg[N], x[N], y[N], ans[N] ;
struct qry {
int x, l, r, id ;
inline bool operator < (const qry &rhs) const {
return bl[l] == bl[rhs.l] ? ((bl[l] & 1) ? r < rhs.r : r > rhs.r) : l < rhs.l ;
}
} a[N] ;
inline void upd1(register int i) {
swap(pos[x[i]], pos[y[i]]) ;
swap(neg[pos[x[i]]], neg[pos[y[i]]]);
}
inline void upd2(register int i) {
swap(neg[x[i]], neg[y[i]]) ;
swap(pos[neg[x[i]]], pos[neg[y[i]]]);
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>q;
rep(i, 1, n) pos[i] = neg[i] = i ;
rep(i, 1, m) cin>>x[i]>>y[i];
rep(i, 1, q) {cin>>a[i].x>>a[i].l>>a[i].r;a[i].id = i ;}
rep(i, 1, m) bl[i] = (i - 1) / sqrt(m) + 1 ;
sort(a + 1, a + q + 1) ;
int l = 1, r = 0 ;
rep(i, 1, q) {
while (l > a[i].l) upd1(--l) ;
while (r < a[i].r) upd2(++r) ;
while (l < a[i].l) upd1(l++) ;
while (r > a[i].r) upd2(r--) ;
ans[a[i].id] = pos[a[i].x] ;
cout<<a[i].l<<" "<<a[i].r<<" "<<pos[a[i].x]<<endl;;
}
//rep(i, 1, q) cout<<ans[i]<<"\n";
return 0 ;
}