#include <bits/stdc++.h>   #pragma GCC optimize( O3 )   using namespace std;   const int N = (int)2e5 + 100;   const int M = (int)2e6 + 100;   const int inf = (int)1e9 + 100;   int a[N];   int b[N];   int t[4 * N];   map<int, int> m[4 * N];   void add(int x, int L, int R, int pos, int val) {     t[x] = min(t[x], val);     m[x][val]++;     if (R - L == 1) {       return;     }     int c = (L + R) >> 1;     if (c > pos) {       add(2 * x + 1, L, c, pos, val);     } else {       add(2 * x + 2, c, R, pos, val);     }   }   int sum(int x, int L, int R, int l, int r) {     if (R == r && L == l) {       return t[x];     }     int c = (L + R) >> 1;     int o = inf;     if (c > l) {       o = sum(2 * x + 1, L, c, l, min(c, r));     }     if (c < r) {       o = min(o, sum(2 * x + 2, c, R, max(l, c), r));     }     return o;   }   int del(int x, int L, int R, int l, int r, int val) {     if (R - L == 1) {       m[x][val]--;       if (!m[x][val]) m[x].erase(val);       if (m[x].size())         t[x] = m[x].begin()->first;       else         t[x] = inf;       return L;     }     int c = (L + R) >> 1;     int o = -1;     m[x][val]--;     if (!m[x][val]) m[x].erase(val);     if (c > l && m[2 * x + 1].count(val)) {       o = del(2 * x + 1, L, c, l, min(c, r), val);     }     if (c < r && m[2 * x + 2].count(val) && o == -1) {       o = del(2 * x + 2, c, R, max(l, c), r, val);     }     t[x] = min(t[2 * x + 1], t[2 * x + 2]);     return o;   }   void print(int x, int L, int R) {     cout << x <<     << L <<     << R <<  :  << t[x] <<   n ;     for (auto j : m[x]) {       cout << j.first <<     << j.second <<   n ;     }     cout <<   n ;     if (R - L == 1) return;     int c = (L + R) >> 1;     print(2 * x + 1, L, c);     print(2 * x + 2, c, R);   }   int main() {     mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());     srand(time(0));     ios_base::sync_with_stdio(0);     cin.tie(0);     cout.tie(0);     int n, M, i;     cin >> n >> M;     vector<int> v;     for ((i) = 0; (i) < (n); (i)++) {       cin >> a[i];       v.push_back(a[i]);     }     for ((i) = 0; (i) < (4 * N); (i)++) {       t[i] = inf;     }     for ((i) = 0; (i) < (M); (i)++) {       cin >> b[i];       v.push_back(b[i]);     }     sort((v).begin(), (v).end()),         v.resize(unique((v).begin(), (v).end()) - v.begin());     map<int, int> m;     for ((i) = 0; (i) < (v.size()); (i)++) {       m[v[i]] = i;     }     int R = v.size();     for ((i) = 0; (i) < (M); (i)++) {       int p;       cin >> p;       add(0, 0, R, m[b[i]], p);     }     int ma = 0;     vector<pair<int, long long> > g;     for ((i) = n - 1; (i) >= 0; (i)--) {       if (a[i] > ma) {         ma = a[i];         g.push_back({i, a[i]});       } else {         g[g.size() - 1].second += a[i];       }     }     int ans = 0;     for ((i) = 0; (i) < (g.size()); (i)++) {       int x = sum(0, 0, R, 0, m[a[g[i].first]] + 1);       int y;       while (x != inf && x <= g[i].second) {         y = del(0, 0, R, 0, m[a[g[i].first]] + 1, x);         ans++;         g[i].second -= x;         x = sum(0, 0, R, 0, m[a[g[i].first]] + 1);       }       if (x != inf) {         y = del(0, 0, R, 0, m[a[g[i].first]] + 1, x);         add(0, 0, R, y, x - g[i].second);       }     }     cout << ans;   }