#include<cstdio>
#include<algorithm>
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define per(x,y,z) for(int x=z;x>=y;x--)
using namespace std;
const int N=1e5+10;
struct node
{
int id,mmax,mmin,x,dp;
}no[N];
int t[N],n,mmax;
inline void add(int i,int x) {while(i<=mmax) t[i]=max(t[i],x),i+=i&-i;}
inline int query(int i) {int sum=0;while(i) sum=max(t[i],sum),i-=i&-i;return sum;}
inline void clean(int i) {while(i<=mmax) t[i]=0,i+=i&-i;}
bool comp1(const node &P,const node &Q) {return P.id<Q.id;}
bool comp2(const node &P,const node &Q) {return P.mmax<=Q.mmax;}
bool comp3(const node &P,const node &Q) {return P.x<=Q.x;}
void CDQ(int l,int r)
{
if(l==r) return ;
int mid=l+r>>1;
sort(no+l,no+1+r,comp1);
CDQ(l,mid);
sort(no+l,no+mid+1,comp2);
sort(no+mid+1,no+r+1,comp3);
int j=l;
rep(i,mid+1,r)
{
while(j<=mid&&no[j].mmax<=no[i].x) add(no[j].x,no[j].dp),j++;
no[i].dp=max(no[i].dp,query(no[i].mmin)+1);
}
rep(i,l,j-1) clean(no[i].x);
CDQ(mid+1,r);
}
int main()
{
int m;
scanf("%d%d",&n,&m);
rep(i,1,n)
{
scanf("%d",&no[i].x);
no[i].mmax=no[i].mmin=no[i].x;
mmax=max(mmax,no[i].x);
no[i].id=i;
no[i].dp=1;
}
rep(i,1,m)
{
int x,y;
scanf("%d%d",&x,&y);
mmax=max(mmax,y);
no[x].mmax=max(no[x].mmax,y);
no[x].mmin=min(no[x].mmin,y);
}
CDQ(1,n);
int ans=0;
rep(i,1,n) ans=max(ans,no[i].dp);
printf("%d",ans);
return 0;
}