RT,有没有 dalao 帮忙调一下或者给一组 hack /kel
#include<bits/stdc++.h>
#define lowbit(x) x&-x
#define N 100000
using namespace std;
int tree[100005],n,m;
inline void add(int x,int k) {
for(; x<=N; x+=lowbit(x)) tree[x]=max(tree[x],k);
}
inline int query(int x) {
int res=0;
for(; x; x-=lowbit(x)) res=max(res,tree[x]);
return res;
}
inline void clr(int x) {
for(; x<=N; x+=lowbit(x)) tree[x]=0;
}
struct node {
int x,mx,mn,id;
} a[100005];
inline bool cmp1(node u,node v) {
return u.mx<v.mx;
}
inline bool cmp2(node u,node v) {
return u.x<v.x;
}
inline bool cmp3(node u,node v) {
return u.id<v.id;
}
int f[100005],ans;
void cdq(int l,int r) {
if(l==r) {
f[l]=max(f[l],1);
ans=max(ans,f[l]);
return ;
}
int mid=(l+r)>>1;
cdq(l,mid);
sort(a+l,a+mid+1,cmp1);
sort(a+mid+1,a+r+1,cmp2);
int j=l;
for(int i=mid+1; i<=r; i++) {
while(j<=mid&&a[j].mx<=a[i].x)
add(a[j].x,f[j]),j++;
f[i]=max(f[i],query(a[i].mn)+1);
ans=max(ans,f[i]);
}
for(int i=l; i<=mid; i++) clr(a[i].x);
sort(a+mid+1,a+r+1,cmp3);
cdq(mid+1,r);
}
int main() {
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++) scanf("%d",&a[i].x),a[i].mx=a[i].mn=a[i].x,a[i].id=i;
for(int i=1,x,y; i<=m; i++) {
scanf("%d%d",&x,&y);
a[x].mx=max(a[x].mx,y);
a[x].mn=min(a[x].mn,y);
}
cdq(1,n);
cout<<ans;
return 0;
}