#pragma GCC optimize (2)
#pragma G++ optimize (2)
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define mod 1000000007
#define MAX 305
using namespace std;
//char nc()
//{
//	static char buf[100000],*p1=buf,*p2=buf;
//	return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
//}
char nc(){return getchar();}
int read()
{
	int x=0,y=1;
	char c=nc();
	while(!isdigit(c))
	{
		if(c=='-')y=-1;
		c=nc();
	}
	while(isdigit(c))
	{
		x=(x<<1)+(x<<3)+(c^48);
		c=nc();
	}
	return x*y;
}
int n,a[MAX<<1],b[MAX<<1],cnt=0;
long long f[2][MAX][MAX];
long long mo(long long x)
{
	return x<mod?x:x-mod;
}
int main()
{
	n=read();
	for(int i=1;i<=n*2;i++)
		a[i]=read();
	for(int i=1;i<=n*2;i+=2)
		if(a[i]==-1&&a[i+1]==-1)
			cnt++;
		else if(a[i]==-1)
			b[a[i+1]]=1;
		else if(a[i+1]==-1)
			b[a[i]]=1;
		else
			b[a[i]]=b[a[i+1]]=2;
	int now=0,last=1,up1=0,up2=0;
	f[now][0][0]=1;
	for(int i=n*2;i;i--)
	{
		if(b[i]==2) continue;
		now^=1;last^=1;
		for(int j=0;j<=up1;j++)
			for(int k=0;k<=up2;k++)
				if(f[last][j][k])
				{
					if(b[i])
						f[now][j+1][k]=mo(f[now][j+1][k]+f[last][j][k]);
					else
					{
						f[now][j][k+1]=mo(f[now][j][k+1]+f[last][j][k]);
						if(j) f[now][j-1][k]=(f[now][j-1][k]+f[last][j][k]*j)%mod;
					}
					if(k) f[now][j][k-1]=mo(f[now][j][k-1]+f[last][j][k]);
					f[last][j][k]=0;
				}
		if(b[i]) up1=min(n,up1+1);
		else up2=min(n,up2+1);
	}
	long long ANS=f[now][0][0];
	for(int i=1;i<=cnt;i++)
		ANS=ANS*i%mod;
	printf("%lld",ANS);
	return 0;
}
