#include using namespace std; void init(vector& d, vector& a, int n); void update(vector& d, int i, int x); int min_query(vector& d, int l, int r, int k, int seg_l, int seg_r); int main(void){ const int MAX_N = 1e6; int n, q; cin >> n >> q; vector a(MAX_N, INT_MAX); vectordat(2*MAX_N-1, INT_MAX); for(int i = 0; i < n; i++) cin >> a[i]; n = pow(2, ceil(log2(n))); init(dat, a, n); for(int i = 0; i < q; i++){ int q_type, l, r; cin >> q_type >> l >> r; if(q_type == 1){ int lindex = l-1+n-1; int rindex = r-1+n-1; update(dat, lindex, a[r-1]); update(dat, rindex, a[l-1]); swap(a[l-1], a[r-1]); }else{ int min = min_query(dat, l-1, r, 0, 0, n); int index; for(int i = 0; a[i] < INT_MAX; i++){ if(a[i] == min) index = i; } cout << index+1 << endl; } } return 0; } void init(vector& d, vector& a, int n){ for(int i = 0; i < n; i++){ update(d, i+n-1, a[i]); } } void update(vector& d, int i, int x){ d[i] = x; if(i > 0){ i = (i-1)/2; x = min(d[2*i+1], d[2*i+2]); update(d, i, x); }else{ return; } } int min_query(vector& d, int l, int r, int k, int seg_l, int seg_r){ if(r <= seg_l || seg_r <= l) return INT_MAX; else if(l <= seg_l && seg_r <= r) return d[k]; else return min(min_query(d, l, r, 2*k+1, seg_l, (seg_l+seg_r)/2), min_query(d, l, r, 2*k+2, (seg_l+seg_r)/2, seg_r)); }