#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"); } }