rt,剩下5个点超时
#include<bits/stdc++.h>
using namespace std;
struct node
{
int a,c,b,num;
}q[100005],q0[100005];
int dp[100005],n,m,maxx;
inline bool cmpa(node x,node y)
{
return x.a<y.a;
}
inline bool cmpb(node x,node y)
{
return x.b<y.b;
}
int t[100005];
inline int lowbit(int x){return x&-x;}
inline void add(int x,int y)
{
for(int i=x;i<=maxx;i+=lowbit(x))
if(y!=0) t[i]=max(t[i],y);
else t[i]=0;
}
inline int getmax(int x)
{
int maxx=-1;
for(int i=x;i>=1;i-=lowbit(i))
maxx=max(maxx,t[i]);
return maxx;
}
inline void cdq(int l,int r)
{
if(l>=r) return;
int mid=l+r>>1;
cdq(l,mid);
sort(q+l,q+mid+1,cmpa);
sort(q+mid+1,q+r+1,cmpb);
for(int i=l,j=mid+1;j<=r;j++)
{
while(i<=mid && q[i].a<=q[j].b)
add(q[i].c,dp[q[i].num]),i++;
dp[q[j].num]=max(dp[q[j].num],getmax(q[j].a)+1);
}
for(int i=l;i<=mid;i++)
add(q[i].c,0);
for(int i=l;i<=r;i++)
q[i]=q0[i];
cdq(mid+1,r);
}
signed main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&q[i].a);
q[i].b=q[i].c=q[i].a;
q[i].num=i;
maxx=max(maxx,q[i].a);
}
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
q[x].b=min(q[x].b,y);
q[x].c=max(q[x].c,y);
maxx=max(maxx,y);
}
for(int i=1;i<=n;i++)
dp[i]=1,q0[i]=q[i];
cdq(1,n);
int ans=-1;
for(int i=1;i<=n;i++)
ans=max(ans,dp[i]);
printf("%d",ans);
return 0;
}