最后一个点TLE了
#include<bits/stdc++.h>
#define MAXN 150000
using namespace std;
inline int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9') f= (c=='-')?-1:1,c=getchar();
while(c>='0'&&c<='9') x=x*10+c-48,c=getchar();
return f*x;
}
struct Edge
{
int c;
int next,to;
}e[MAXN<<5];
int n,m,s,t,head[MAXN],flow[MAXN],dis[MAXN],vis[MAXN],pre[MAXN],cnt=-1,sum,maxf;
void add(int u,int v,int c)
{
e[++cnt].c=c;
e[cnt].next=head[u];
e[cnt].to=v;
head[u]=cnt;
}
void add_Edge(int u,int v,int c){add(u,v,c),add(v,u,0);}
bool SPFA()
{
memset(dis,0x7f,sizeof(dis));
memset(flow,0,sizeof(flow));
memset(vis,0,sizeof(vis));
queue<int> q;
q.push(s),vis[s]=1,flow[s]=MAXN,dis[s]=0;
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=0;
for(int i=head[u];i!=-1;i=e[i].next)
{
int v=e[i].to;
if(e[i].c&&dis[v]>dis[u]+1)
{
dis[v]=dis[u]+1;
flow[v]=min(flow[u],e[i].c);
pre[v]=i;
if(!vis[v]) vis[v]=1,q.push(v);
}
}
}
return flow[t];
}
void getans()
{
while(SPFA())
{
maxf+=flow[t];
for(int i=t;i!=s;i=e[pre[i]^1].to)
{
e[pre[i]].c-=flow[t];
e[pre[i]^1].c+=flow[t];
}
}
}
signed main()
{
memset(head,-1,sizeof(head));
m=read();
n=read();
s=0,t=n+m+1;
for(int i=1;i<=m;i++)
{
int x;
x=read();;
sum+=x;
add_Edge(s,i,x);
}
for(int i=1;i<=n;i++)
{
int x;
x=read();
add_Edge(m+i,t,x);
}
for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) add_Edge(i,m+j,1);
getans();
if(maxf!=sum)
{
printf("0");
return 0;
}
printf("1\n");
for(int i=1;i<=m;i++)
{
for(int j=head[i];j!=-1;j=e[j].next) if(e[j].to>m&&e[j].c==0) printf("%d ",e[j].to-m);
printf("\n");
}
}