#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
#include<string>
#include<map>
#include<cstring>
#include<limits.h>
#include<stdio.h>
#include<queue>
#include<set>
using namespace std;
#define ll  long long int
#define llu long long unsigned int
#define mod 5000000
#define pb push_back
#define pi pair<ll,ll>
#define mp make_pair
#define f first
#define s second
#define ma 4000010
#define get(n) scanf("%lld",&n)
#define yup(t) printf("%lld\n",t)
ll bt[100005]={0};
//ll bt1[100005]={0};
ll n;
bool func(pi a,pi b){
	if(a.f==b.f) return (a.s<b.s);
	return (a.f<b.f);
}
ll a[100000+5];
int main(){
	ll t,m;
    //freopen("s1.txt","r",stdin);
	get(t);
	while(t--){
		get(n);
		get(m);
	//	memset(bt1,0,sizeof(bt1));
		memset(bt,0,sizeof(bt));
		for(int i=1;i<=n;i++){
			get(a[i]);
		}
		ll l,r;
		vector<pi>temp,ans;
		for(int i=0;i<m;i++){
			get(l);
			get(r);
			temp.pb(mp(l,r));
		}
		sort(temp.begin(),temp.end(),func);
		ll s=temp[0].f,e=temp[0].s;
		for(int i=0;i<=m-2;i++){
			if(e>=temp[i+1].f){
				e=max(e,temp[i+1].s);
			}
			else{
				ans.pb(mp(s,e));
				s=temp[i+1].f;
				e=temp[i+1].s;
			}
		}
		ans.pb(mp(s,e));
		bool h=1;
		ll mini=INT_MAX;
		ll maxi=INT_MIN;
		for(int i=0;i<ans.size();i++){
			for(int j=ans[i].f;j<=ans[i].s;j++){
				mini=min(mini,a[j]);
				maxi=max(maxi,a[j]);
			}
			if(!(mini==ans[i].f&&maxi==ans[i].s)){
				h=0;
				break;
			}
			mini=INT_MAX;
			maxi=INT_MIN;
		}
		if(h){
			printf("Possible\n");
		}
		else printf("Impossible\n");
	}
}