仅供整活,30pts
#include<bits/stdc++.h>
using namespace std;
int a[20005];
int n,m;
struct edge
{
int to,nxt,flow;
};
int tot=1,head[50005],cur[50005],lev[50005];
vector<edge> e;
void add(int u,int v,int w)
{
++tot;
e.push_back({v,head[u],w});
head[u]=tot;
}
queue<int> q;
bool bfs(int s,int t)
{
memcpy(cur,head,sizeof(head));
memset(lev,0x3f,sizeof(lev));
q.push(s);
lev[s]=1;
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=head[u];i;i=e[i].nxt)
{
if(e[i].flow==0) continue;
int v=e[i].to;
if(lev[v]!=0x3f3f3f3f) continue;
lev[v]=lev[u]+1;
q.push(v);
}
}
return lev[t]!=0x3f3f3f3f;
}
int dfs(int p,int t,int maxflow)
{
int totflow=0;
if(p==t) return maxflow;
for(int &i=cur[p];i;i=e[i].nxt)
{
if(lev[e[i].to]==lev[p]+1&&e[i].flow!=0)
{
int nowflow=dfs(e[i].to,t,min(maxflow,e[i].flow));
if(nowflow==0) lev[e[i].to]=-0x3f3f3f3f;
totflow+=nowflow;
e[i].flow-=nowflow;
e[i^1].flow+=nowflow;
maxflow-=nowflow;
if(totflow==maxflow) break;
}
}
return totflow;
}
void dinic(int s,int t)
{
int mxflow=0;
while(bfs(s,t))
while(int flow=dfs(s,t,0x3f3f3f3f))
mxflow+=flow;
cout<<mxflow<<endl;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
e.push_back({0,0,0});
e.push_back({0,0,0});
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+n+1);
int ss=n+m+1,tt=ss+1;
for(int i=1;i<=m;i++)
add(ss,i,1),add(i,ss,0);
for(int j=1;j<=n;j++)
add(j+m,tt,1),add(tt,j+m,0);
for(int i=1;i<=m;i++)
{
int L,R;
cin>>L>>R;
int l=lower_bound(a+1,a+n+1,L)-a;
int r=lower_bound(a+1,a+n+1,R)-a;
if(a[r]>R||r>n) r--;
for(int j=l;j<=r;j++)
add(i,j+m,1),add(j+m,i,0);
}
dinic(ss,tt);
return 0;
}