#include #include #include #include #include #include #include #include #define rep(i,n) for (int i = 0; i < (int)n; i++) using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair pi; typedef pair pp; typedef pair pl; double PI = 3.1415926535897932; const double EPS = 1e-9; const ll MOD = 1000000007; const int inf = 1 << 30; const ll linf = 1LL << 60; // 区間最小値、要素更新のsegtree template struct segtree{ int n; vector dat; T unit; void init(int n_, T unit_) { unit = unit_; n = 1; while(n < n_) n *= 2; dat.assign(2*n-1, unit); } void update(int k, T a){ k += n-1; dat[k] = a; while(k > 0){ k = (k-1)/2; dat[k] = min(dat[k*2+1], dat[k*2+2]); } } //(a,b,0,0,seg.n)で呼ぶ T query(int a, int b, int k, int l, int r){ if(r <= a || b <= l) return unit; if(a <= l && r <= b) return dat[k]; else{ T vl = query(a,b,k*2+1,l,(l+r)/2); T vr = query(a,b,k*2+2,(l+r)/2,r); return min(vl, vr); } } }; int n, q; segtree seg; int main() { cin >> n >> q; seg.init(n, pi(inf,inf)); rep(i,n) { int a; cin >> a; seg.update(i, pi(a,i)); } rep(i,q) { int f, l, r; cin >> f >> l >> r; l--; r--; if (f == 1) { pi lv = seg.dat[seg.n-1+l], rv = seg.dat[seg.n-1+r]; seg.update(l, pi(rv.first,l)); seg.update(r, pi(lv.first,r)); } else { cout << seg.query(l, r+1, 0, 0, seg.n).second + 1 << endl; } } }