#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
#define pi 3.141592653589793238
#define int long long
using namespace __gnu_pbds;
using namespace std;
template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;


  

long long power(long long a, long long b,long long mod) {
    long long res = 1;
    while (b > 0) {
        if (b & 1)
            res = res * a %mod;
        a = a * a %mod;
        b >>= 1;
    }
    return res;
}

pair<int,int>p[105];
int mm1[205];
int mm2[205];
int dp[205][105];
int n;
int over[205];

int solve(int x,int len)
{
    int tot=0;
    for(int i=x;i<x+len;i++)
    {
        if(mm1[i])
        {
            int z=mm1[i];
            if(p[z].second!=-1)
            {
                if(p[z].second-p[z].first!=len)
                {
                    return -1;
                }
            }
            else if(mm2[i+len])
            {
                return -1;
            }
        }
        else if(!mm2[i+len])
        {
            tot++;
        }
    }
    return tot;
}

signed main()
{

ios_base::sync_with_stdio(false);
cin.tie(NULL);  
cout.tie(0);   

#ifndef ONLINE_JUDGE
    if(fopen("INPUT.txt","r"))
    {
    freopen ("INPUT.txt" , "r" , stdin);
    freopen ("OUTPUT.txt" , "w" , stdout);
    }
#endif      

    cin>>n;
    int cnt=0;
    for(int i=1;i<=n;i++)
    {
        cin>>p[i].first>>p[i].second;
        if(p[i].first!=-1)
        {
            over[p[i].first]++;
            mm1[p[i].first]=i;
        }
        if(p[i].second!=-1)
        {
            over[p[i].second]++;
            mm2[p[i].second]=i;           
        }
        if(p[i].first==-1 && p[i].second==-1)
            cnt++;
    }
    for(int i=1;i<=2*n;i++)
    {
        if(over[i]>1)
        {
            cout<<"No";
            return 0;
        }
    }

    dp[0][cnt]=1;
    for(int i=0;i<=2*n;i++)
    {
        for(int j=cnt;j>=0;j--)
        {
            if(dp[i][j])
            {
                for(int k=1;k<=n;k++)
                {
                    if(i+2*k<=2*n)
                    {
                        int kad=solve(i+1,k);
                        if(kad!=-1)
                        if(j-kad>=0)
                            dp[i+2*k][j-kad]|=1;
                    }
                }
            }
        }
    }

    if(dp[2*n][0])
        cout<<"Yes";
    else
        cout<<"No";



}    

/*
Author: QAQAutomaton
Lang: C++
Code: C.cpp
Mail: lk@qaq-am.com
Blog: https://www.qaq-am.com/
*/
#include<bits/stdc++.h>
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define DEBUG printf("Passing [%s] in LINE %d\n",__FUNCTION__,__LINE__)
#define Debug debug("Passing [%s] in LINE %d\n",__FUNCTION__,__LINE__)
#define all(x) x.begin(),x.end()
#define x first
#define y second
using namespace std;
typedef unsigned uint;
typedef long long ll;
typedef unsigned long long ull;
typedef complex<double> cp;
typedef pair<int,int> pii;
int inf;
const double eps=1e-8;
const double pi=acos(-1.0);
template<class T,class T2>int chkmin(T &a,T2 b){return a>b?a=b,1:0;}
template<class T,class T2>int chkmax(T &a,T2 b){return a<b?a=b,1:0;}
template<class T>T sqr(T a){return a*a;}
template<class T,class T2>T mmin(T a,T2 b){return a<b?a:b;}
template<class T,class T2>T mmax(T a,T2 b){return a>b?a:b;}
template<class T>T aabs(T a){return a<0?-a:a;}
template<class T>int dcmp(T a,T b){return a>b;}
template<int *a>int cmp_a(int x,int y){return a[x]<a[y];}
#define min mmin
#define max mmax
#define abs aabs
struct __INIT__{
	__INIT__(){
		fill((unsigned char *)(&inf),(unsigned char *)(&inf)+sizeof(inf),0x3f);
	}
}__INIT___;
namespace io {
	const int SIZE = (1 << 21) + 1;
	char ibuf[SIZE], *iS, *iT, obuf[SIZE], *oS = obuf, *oT = oS + SIZE - 1, c, qu[55]; int f, qr;
	// getchar
	#define gc() (iS == iT ? (iT = (iS = ibuf) + fread (ibuf, 1, SIZE, stdin), (iS == iT ? EOF : *iS ++)) : *iS ++)
	// print the remaining part
	inline void flush () {
		fwrite (obuf, 1, oS - obuf, stdout);
		oS = obuf;
	}
	// putchar
	inline void putc (char x) {
		*oS ++ = x;
		if (oS == oT) flush ();
	}
	template<typename A>
	inline bool read (A &x) {
		for (f = 1, c = gc(); c < '0' || c > '9'; c = gc()) if (c == '-') f = -1;else if(c==EOF)return 0;
		for (x = 0; c <= '9' && c >= '0'; c = gc()) x = x * 10 + (c & 15); x *= f;
		return 1;
	}
	inline bool read (char &x) {
		while((x=gc())==' '||x=='\n' || x=='\r');
		return x!=EOF;
	}
	inline bool read(char *x){
		while((*x=gc())=='\n' || *x==' '||*x=='\r');
		if(*x==EOF)return 0;
		while(!(*x=='\n'||*x==' '||*x=='\r'||*x==EOF))*(++x)=gc();
		*x=0;
		return 1;
	}
	template<typename A,typename ...B>
	inline bool read(A &x,B &...y){
		return read(x)&&read(y...);
	}
	template<typename A>
	inline bool write (A x) {
		if (!x) putc ('0'); if (x < 0) putc ('-'), x = -x;
		while (x) qu[++ qr] = x % 10 + '0',  x /= 10;
		while (qr) putc (qu[qr --]);
		return 0;
	}
	inline bool write (char x) {
		putc(x);
		return 0;
	}
	inline bool write(const char *x){
		while(*x){putc(*x);++x;}
		return 0;
	}
	inline bool write(char *x){
		while(*x){putc(*x);++x;}
		return 0;
	}
	template<typename A,typename ...B>
	inline bool write(A x,B ...y){
		return write(x)||write(y...);
	}
	//no need to call flush at the end manually!
	struct Flusher_ {~Flusher_(){flush();}}io_flusher_;
}
using io :: read;
using io :: putc;
using io :: write;
int s[1<<8|5],atl[1<<8|5];
pii e[100005];
int g[9][9];
int dis[9][9],p[9];
int n,m;
signed main(){
#ifdef QAQAutoMaton 
	freopen("C.in","r",stdin);
	freopen("C.out","w",stdout);
#endif
	read(n,m);
	int mx=0;
	for(int i=0;i<n;++i){
		read(s[1<<i]);
		chkmax(mx,s[1<<i]);
	}
	for(int i=1;i<(1<<n);++i)if(i&(i-1))s[i]=s[i&(i-1)]+s[i&(-i)];
	for(int i=1;i<=m;++i){
		read(e[i].y,e[i].x);
		if(mx>e[i].x)return write("-1\n");
	}
	sort(e+1,e+m+1);
	for(int i=1;i<=m;++i)chkmax(e[i].y,e[i-1].y);
	for(int i=0;i<(1<<n);++i){
		atl[i]=(lower_bound(e+1,e+m+1,make_pair(s[i],-1))-1)->y;
	}
	for(int i=1;i<=n;++i)p[i]=i-1;
	int ans=inf;
	do{
		for(int i=1;i<=n;++i){
			int w=0;
			for(int j=i;j;--j){
				w|=1<<p[j];
				dis[j][i]=-atl[w];
			}
			for(int j=i+1;j<=n;++j)dis[j][i]=inf;
		}
		for(int k=1;k<=n;++k)
			for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)chkmin(dis[i][j],dis[i][k]+dis[k][j]);
		chkmin(ans,-dis[1][n]);
	}while(next_permutation(p+1,p+n+1));
	write(ans,'\n');
	return 0;
}

