func_code_string: #include <bits/stdc++.h>   using namespace std;   const int dy[] = {-1, 0, 1, 0}, dx[] = {0, 1, 0, -1};   const double EPS = 1e-8;   const double PI = acos(-1.0);   int popcount(int n) { return __builtin_popcount(n); }   int popcount(long long n) { return __builtin_popcountll(n); }   template <class T>   int SIZE(T a) {     return a.size();   }   template <class T>   string IntToString(T num) {     string res;     stringstream ss;     ss << num;     return ss.str();   }   template <class T>   T StringToInt(string str) {     T res = 0;     for (int i = 0; i < SIZE(str); i++) res = (res * 10 + str[i] -  0 );     return res;   }   template <class T>   T gcd(T a, T b) {     if (b == 0) return a;     return gcd(b, a % b);   }   template <class T>   T lcm(T a, T b) {     return a / gcd(a, b) * b;   }   template <class T>   void PrintSeq(T &a, int sz) {     for (int i = 0; i < sz; i++) {       cout << a[i];       if (sz == i + 1)         cout << endl;       else         cout <<    ;     }   }   long long getTen(int a) { return (a <= 0) ? 1 : (getTen(a - 1) * 10); }   bool EQ(double a, double b) { return abs(a - b) < EPS; }   void fastStream() {     cin.tie(0);     std::ios_base::sync_with_stdio(0);   }   vector<string> split(string str, char del) {     vector<string> res;     for (int i = 0, s = 0; i < SIZE(str); i++) {       if (str[i] == del) {         if (i - s != 0) res.push_back(str.substr(s, i - s));         s = i + 1;       } else if (i == SIZE(str) - 1) {         res.push_back(str.substr(s));       }     }     return res;   }   int N;   int as[500001];   int valToPos[500010];   int posToVal[500010];   const int MAX_N = 5000100;   class BIT {    private:     long long bit[MAX_N];     int n;       public:     BIT(int sz) {       n = sz;       for (int i = 0; i <= n; i++) bit[i] = 0;     }     long long sum(int i) {       long long s = 0;       while (i > 0) {         s += bit[i];         i -= i & -i;       }       return s;     }     long long rangeSum(int from, int to) {       long long res = 0;       res = sum(to) - sum(from - 1);       return res;     }     void add(int i, long long x) {       while (i <= n) {         bit[i] += x;         i += i & -i;       }     }     void insert(int i, long long x) { add(i, -(sum(i) - sum(i - 1)) + x); }   };   BIT bit(1000000);   int main() {     cin >> N;     for (int i = 0; i < N; i++) {       cin >> as[i];       posToVal[i] = as[i];       valToPos[as[i]] = i;     }     for (int i = 0; i < N; i++) {       if (as[i] == 1)         bit.add(1, 0);       else {         int pos1 = i;         int pos2 = valToPos[as[i] - 1];         if (pos2 > pos1) {           bit.add(as[i], 1);         }       }     }     int Q;     cin >> Q;     for (int i = 0; i < Q; i++) {       int p, x, y;       cin >> p >> x >> y;       if (p == 1) {         cout << bit.rangeSum(x, y) + 1 - bit.rangeSum(x, x) << endl;       } else {         int posx = x - 1;         int posy = y - 1;         x = posToVal[posx];         y = posToVal[posy];         valToPos[x] = posy;         valToPos[y] = posx;         posToVal[posx] = y;         posToVal[posy] = x;         int ary[6] = {x, x - 1, x + 1, y, y - 1, y + 1};         for (int j = 0; j < 6; j++) {           int num = ary[j];           if (num == 0)             continue;           else if (num == 1)             continue;           else {             int pos1 = valToPos[num];             int pos2 = valToPos[num - 1];             if (pos2 > pos1)               bit.insert(num, 1);             else               bit.insert(num, 0);           }         }       }     }     return 0;   }   