#include <bits/stdc++.h>
#define int long long
#define j q[hd]
using namespace std;
const int N = 3e5 + 5;
int n, m, a[N], b[N], u[N], v[N], la[N], fr[N], q[N], f[N], hd, tl;
struct node{int u, v;}c[N];
bool cmp(node x, node y){return x.u == y.u ? x.v > y.v : x.u < y.u;}
int X(int x){return fr[u[x + 1] - 1];}
int Y(int x){return f[x];}
int K(int x){return la[v[x] + 1];}
double slope(int x, int y){return X(x) == X(y) ? - 1e18 : - 1.0 * (Y(x) - Y(y)) / (X(x) - X(y));}
signed main()
{
cin >> n >> m;
for(int i = 1; i <= n; i++)scanf("%lld", &a[i]);
for(int i = 1; i <= n; i++)scanf("%lld", &b[i]);
for(int i = 1; i <= m; i++)scanf("%lld %lld", &c[i].u, &c[i].v);
sort(c + 1, c + 1 + m, cmp); int cnt = m; m = 0;
for(int i = 1, ma = 0; i <= cnt; i++)
{
if(c[i].v <= ma)continue;
u[++m] = c[i].u, ma = v[m] = c[i].v;
}
la[n + 1] = 1e18, fr[0] = 1e18, u[0] = 1;
for(int i = 1; i <= n; i++)fr[i] = min(fr[i - 1], a[i]);
for(int i = n; ~ i; i--)la[i] = min(la[i + 1], b[i]);
for(int i = 1; i <= m; i++)
{
while(hd < tl and slope(j, q[hd + 1]) > - K(i))hd++;
f[i] = f[j] + X(j) * K(i);
while(hd < tl and slope(q[tl - 1], q[tl]) < slope(q[tl], i))tl--;
q[++tl] = i;
}
cout << f[m];
}