func_code_string: #include <bits/stdc++.h>   using namespace std;   vector<string> split(const string& s, char c) {     vector<string> v;     stringstream ss(s);     string first;     while (getline(ss, first, c)) v.emplace_back(first);     return move(v);   }   void err(vector<string>::iterator it) {}   template <typename T, typename... Args>   void err(vector<string>::iterator it, T a, Args... args) {     cerr << a <<    ;     err(++it, args...);   }   const int M = 5000100, mod = 1000000007;   struct segment_tree {     pair<int, int> T[M];     segment_tree() {}     pair<int, int> find_min(pair<int, int> a, pair<int, int> b) {       return a.first < b.first ? a : b;     }     void build(int* A, int i, int l, int r) {       if (l == r)         T[i] = make_pair(A[l], l);       else {         int m = (l + r) / 2;         build(A, 2 * i, l, m);         build(A, 2 * i + 1, m + 1, r);         T[i] = find_min(T[2 * i], T[2 * i + 1]);       }     }     void update(int i, int l, int r, int first) {       if (l == r && r == first)         T[i] = make_pair(1111111111, l);       else if (first >= l && first <= r) {         int m = (l + r) / 2;         update(2 * i, l, m, first);         update(2 * i + 1, m + 1, r, first);         T[i] = find_min(T[2 * i], T[2 * i + 1]);       }     }     pair<int, int> query(int i, int l, int r, int st, int ed) {       if (l >= st && r <= ed)         return T[i];       else if (l > ed || r < st)         return make_pair(1111111111, -1);       else {         int m = (l + r) / 2;         return find_min(query(2 * i, l, m, st, ed),                         query(2 * i + 1, m + 1, r, st, ed));       }     }   };   struct BIT {     vector<int> tree;     BIT(int n) { tree.resize(n); }     void update(int idx, int val) {       while (idx < tree.size()) {         tree[idx] += val;         idx += idx & (-idx);       }     }     int query(int idx) {       int sum = 0;       while (idx > 0) {         sum += tree[idx];         idx -= idx & (-idx);       }       return sum;     }   };   int A[M], spec[M], n;   segment_tree tree;   BIT bit(M);   long long solve(int l, int r) {     long long sum = 0;     while (l <= r) {       pair<int, int> temp = tree.query(1, 1, n, l, r);       if (temp.first == 1111111111)         break;       else if (spec[temp.first]) {         tree.update(1, 1, n, temp.second);         bit.update(temp.second, -1);         sum += solve(l, temp.second - 1);         sum += solve(temp.second + 1, r);         break;       } else {         sum += bit.query(r) - bit.query(l - 1);         tree.update(1, 1, n, temp.second);         bit.update(temp.second, -1);       }     }     return sum;   }   int main() {     ios_base::sync_with_stdio(false);     int i, j, k, m;     memset((spec), (false), sizeof(spec));     scanf( %d%d , &n, &m);     for (i = 1; i <= n; i++) scanf( %d , &A[i]);     for (j = 1; j <= m; j++) scanf( %d , &k), spec[k] = true;     tree.build(A, 1, 1, n);     for (i = 1; i <= n; i++) bit.update(i, 1);     cout << solve(1, n) << endl;     return 0;   }   