#include #include #include #include #include #include #include using namespace std; const int inf=1E9; const int N=3005; const int M=1E6; struct map{ int x,y,c,w; }a[M],e[M]; int n,m,p,k,u,v,w,s,t,fir[N],next[M],pre[N],f[N],ans,x,y,g[N]; int T,r,s1,s2,P,Q; bool o[N]; queue q; int spfa() { while (1) { q.push(s); memset(f,20,sizeof(f)); f[s]=0; pre[s]=-1; memset(g,10,sizeof(t)); g[s]=inf; while (!q.empty()) { u=q.front(); q.pop(); o[u]=false; for (int i=fir[u];i!=-1;i=next[i]) { v=a[i].y; if (a[i].c&&f[v]>f[u]+a[i].w) { f[v]=f[u]+a[i].w; pre[v]=i; g[v]=min(g[u],a[i].c); if (!o[v]) { q.push(v); o[v]=true; } } } } if (f[t]==f[0]) break; for (int i=pre[t];i!=-1;i=pre[a[i].x]) { a[i].c-=g[t]; a[i^1].c+=g[t]; } } ans=0; for (int i=0;i<=k;i+=2) if (a[i^1].c) ans+=a[i^1].c*a[i].w; } void add(int x,int y,int c,int w) { // cerr<>T; while (T--) { memset(fir,-1,sizeof(fir)); k=-1; cin>>n>>m; s=n*2+5; s1=s+1; s2=s1+1; t=s2+1; add(s,s1,m,0); for (int i=1;i<=n;i++) { scanf("%d",&x); // add(i,n+i,x,0); add(n+i,t,inf,0); // add(s1,i,inf,0); add(n+i,t,x,0); add(s,i,x,0); add(s1,n+i,inf,0); } cin>>r>>P>>Q; add(s,s2,inf,Q); for (int i=P;i<=n;i++) add(s2,n+i,inf,0); for (int i=1;i<=r;i++) { cin>>x>>y; for (int j=1;j<=n;j++) for (int u=j+y;u<=n;u++) add(j,u+n,inf,x); } spfa(); bool o=1; for (int i=0;i<=k;i+=2) if (a[i].y==t&&a[i].c) o=0; if (!o) cout<<"No solution\n"; else cout<