#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <queue>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
struct node
{
int minn,maxx,f,a;
}p[1000000];
int n,m,ans=1;
int aaa[1000000]={};
inline int lowbit(int a){return a&(-a);}
inline int getmax(int k){int ans=0;while(k>0){ans=max(ans,aaa[k]);k-=lowbit(k);}return ans;}
inline void add(int k,int s){while(k<=524288){aaa[k]=max(s,aaa[k]);k+=lowbit(k);}}
inline void clr(int k){while(k<=524288){aaa[k]=0;k+=lowbit(k);}}
inline bool cmp1(node x,node y){return x.maxx<y.maxx;}
inline bool cmp2(node x,node y){return x.a<y.a;}
inline int rd()
{
int s=0;char x='x';
while(x<'0'||x>'9')x=getchar();
while(x>='0'&&x<='9'){s=s*10+(x^48);x=getchar();}
return s;
}
inline void readd()
{
int aa,bb;
n=rd();m=rd();
for(int i=1;i<=n;i++)
{
p[i].a=rd();
p[i].minn=p[i].a;
p[i].maxx=p[i].a;
}
for(int i=1;i<=m;i++)
{
aa=rd();bb=rd();
p[aa].maxx=max(p[aa].maxx,bb);
p[aa].minn=min(p[aa].minn,bb);
}
}
inline void working(int l,int r,int mid)
{
//cout<<l<<' '<<r<<endl;
//cout<<getmax(100000)<<endl;
int j=l;
for(int i=mid+1;i<=r;i++)
{
while(j<=mid&&p[j].maxx<=p[i].a)
{
add(p[j].a,p[j].f);
j++;
}
p[i].f=max(p[i].f,getmax(p[i].minn)+1);
//cout<<p[i].a<<' '<<p[i].f<<'#'<<endl;
//ans=max(ans,p[i].f);
}
for(int i=l;i<j;i++)clr(p[i].a);
}
void cdq(int l,int r)
{
//cout<<l<<' '<<r<<endl;
if(l==r){p[l].f=max(p[l].f,1);return;}
int mid=((l+r)/2);
cdq(l,mid);
sort(p+l,p+mid+1,cmp1);
sort(p+mid+1,p+r+1,cmp2);
working(l,r,mid);
cdq(mid+1,r);
}
int main()
{
readd();
cdq(1,n);
for(int i=1;i<=n;i++)ans=max(ans,p[i].f);
printf("%d",ans);
return 0;
}