#include <cstdio>
#include <algorithm>
using namespace std;
int arb[4000023];
struct str
{
int i;
int j;
}a[240023],b[240023];
int n,l,dyn[240023],val[240023];
int query(int s,int e,int i,int j,int nod)
{
if(i>j) return 1000000000;
if(s==i&&j==e) return arb[nod];
else
{
int mij=(s+e)/2;
if(j<=mij) return query(s,mij,i,j,2*nod);
else if(i>mij) return query(mij+1,e,i,j,2*nod+1);
return min(query(s,mij,i,mij,2*nod),query(mij+1,e,mij+1,j,2*nod+1));
}
}
void update(int s,int e,int pos,int nr,int nod)
{
if(s==e) arb[nod]=nr;
else
{
int mij=(s+e)/2;
if(pos<=mij) update(s,mij,pos,nr,2*nod);
else update(mij+1,e,pos,nr,2*nod+1);
arb[nod]=min(arb[2*nod],arb[2*nod+1]);
}
}
int comp(str a,str b)
{
if(a.i!=b.i) return a.i<b.i;
return a.j<b.j;
}
int main()
{
freopen ("cover.in","r",stdin);
freopen ("cover.out","w",stdout);
for(int i=1;i<=4000000;i++) arb[i]=1000000000;
scanf("%d%d",&l,&n);
int nr;
for(int i=1;i<=n;i++)
{
scanf("%d",&nr);
update(1,n,i,nr,1);
}
for(int i=1;i<=l;i++)
{
scanf("%d%d",&a[i].i,&a[i].j);
}
sort(a+1,a+l+1,comp);
int p1=1,p2;
//b[1]=a[1];
int pos=0;
while(1)
{
int p2=p1+1;
while(p2<=l&&a[p1].i==a[p2].i) p2++;
// printf("%d %d\n",p1,p2);
if((p2==l+1)||(a[p2].j>a[p1].j))
{
b[++pos]=a[p1];
if(pos>1)
{
if(b[pos].i==b[pos-1].j)
{
if(query(1,n,b[pos].i,b[pos].i,1)<query(1,n,b[pos-1].i,b[pos-1].j,1)+query(1,n,b[pos].i,b[pos].j,1))
{
pos--;
b[pos].i=b[pos].j;
}
}
}
}
p1=p2;
if(p1>l) break;
}
// for(int i=1;i<=l;i++) if(val[i]==0) printf("%d %d\n",a[i].i,a[i].j);
// for(int i=1;i<=pos;i++) printf("%d %d\n",b[i].i,b[i].j);
/* int p1=1;
while(val[p1]==1) p1++;
dyn[p1]=query(1,n,a[p1].i,a[p1].j,1);
*/ //printf("%d\n",dyn[p1]);
dyn[1]=query(1,n,b[1].i,b[1].j,1);
for(int i=2;i<=pos;i++)
{
dyn[i]=dyn[i-1]+query(1,n,b[i].i,b[i].j,1);
}
printf("%d\n",dyn[pos]);
}