func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MAX_N = 300000;   const int MAX_E2 = 1 << 20;   struct Elm {     int l, r, v;     Elm() {}     Elm(int _l, int _r, int _v) : l(_l), r(_r), v(_v) {}     Elm(int _l) : l(_l), r(_l), v(1) {}     Elm operator+(const Elm &e) const {       if (v == 0) return e;       if (e.v == 0) return *this;       Elm a;       a.l = l, a.r = e.r;       a.v = v + e.v - ((r < e.l) ? 1 : 0);       return a;     }   };   template <typename T, const int MAX_E2>   struct SegTreeSum {     int n, e2;     T nodes[MAX_E2], z;     SegTreeSum() {}     void init(int n, T _z) {       z = _z;       for (e2 = 1; e2 < n; e2 <<= 1)         ;       fill(nodes, nodes + MAX_E2, z);     }     T &get(int i) { return nodes[e2 - 1 + i]; }     void setall() {       for (int j = e2 - 2; j >= 0; j--)         nodes[j] = nodes[j * 2 + 1] + nodes[j * 2 + 2];     }     void set(int i, T v) {       int j = e2 - 1 + i;       nodes[j] = v;       while (j > 0) {         j = (j - 1) / 2;         nodes[j] = nodes[j * 2 + 1] + nodes[j * 2 + 2];       }     }     T sum_range(int r0, int r1, int k, int i0, int i1) {       if (r1 <= i0 || i1 <= r0) return z;       if (r0 <= i0 && i1 <= r1) return nodes[k];       int im = (i0 + i1) / 2;       T v0 = sum_range(r0, r1, k * 2 + 1, i0, im);       T v1 = sum_range(r0, r1, k * 2 + 2, im, i1);       return v0 + v1;     }     T sum_range(int r0, int r1) { return sum_range(r0, r1, 0, 0, e2); }   };   int as[MAX_N];   SegTreeSum<Elm, MAX_E2> st;   int main() {     int n;     scanf( %d , &n);     st.init(n, Elm(0, 0, 0));     for (int i = 0; i < n; i++) {       scanf( %d , as + i);       as[i]--;       st.get(as[i]) = Elm(i, i, 1);     }     st.setall();     int q;     scanf( %d , &q);     while (q--) {       int p, x, y;       scanf( %d%d%d , &p, &x, &y);       if (p == 1) {         x--;         Elm e = st.sum_range(x, y);         printf( %d n , e.v);       } else {         x--, y--;         int ax = as[x], ay = as[y];         swap(as[x], as[y]);         st.set(ax, Elm(y));         st.set(ay, Elm(x));       }     }     return 0;   }   