# include <iostream>
# include <vector>
using namespace std;
const int MAX=4e5+11;
bool f=1;
int n,m;
int c[MAX];
int d[MAX];
vector<int> col[MAX];
vector<int> new_col[MAX];
vector<pair<int,int>> tree[MAX*4];
void add(int le, int ri, pair<int,int> pa, int v=1, int l=1, int r=n)
{
if(ri<l or r<le) return ;
if(le<=l and r<=ri)
{
tree[v].push_back(pa);
return ;
}
int mid=(l+r)/2;
add(le,ri,pa,v*2,l,mid);
add(le,ri,pa,v*2+1,mid+1,r);
}
struct Change
{
int tm;
int* ptr;
int last_val;
};
struct dsu
{
int par[MAX];
int sz[MAX];
int timer;
vector<Change> ve;
void init()
{
timer=0;
ve.clear();
for(int i=1;i<=n;i++)
{
sz[i]=1;
par[i]=i;
}
}
int root(int x)
{
if(par[x]==x) return x;
return root(par[x]);
}
void unite(int u, int v)
{
u=root(u);v=root(v);
timer++;
if(u==v) return ;
if(sz[u]<sz[v]) swap(u,v);
ve.push_back({timer,par+v,par[v]});
ve.push_back({timer,sz+u,sz[u]});
par[v]=u;
sz[u]+=sz[v];
}
void undo()
{
timer--;
while(ve.size()>0 and ve.back().tm>timer)
{
(*ve.back().ptr)=ve.back().last_val;
ve.pop_back();
}
}
}dsu;
void rec(int v=1, int l=1, int r=n)
{
for(pair<int,int> pa: tree[v]) dsu.unite(pa.first,pa.second);
if(l!=r)
{
int mid=(l+r)/2;
rec(v*2,l,mid);
rec(v*2+1,mid+1,r);
}
else
{
if(new_col[l].size()>0 and col[l].size()==0) f=0;
else
for(int i=0;i<(int)new_col[l].size();i++)
{
if(dsu.root(new_col[l][i])!=dsu.root(col[l][0])) f=0;
}
}
for(pair<int,int> pa: tree[v]) dsu.undo();
}
void reset()
{
f=1;
for(int i=1;i<=n*4;i++) tree[i].clear();
for(int i=1;i<=n;i++)
{
col[i].clear();
new_col[i].clear();
}
}
void solve()
{
cin>>n>>m;
reset();
for(int i=1;i<=n;i++)
{
cin>>c[i];
col[c[i]].push_back(i);
}
for(int i=1;i<=n;i++)
{
cin>>d[i];
new_col[d[i]].push_back(i);
}
for(int i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;
if(max(d[u],d[v])<=min(c[u],c[v])) add(max(d[u],d[v]),min(c[u],c[v]),{u,v});
}
for(int i=1;i<=n;i++)
{
for(int j=0;j<(int)col[i].size()-1;j++) add(i,i,{col[i][j],col[i][j+1]});
}
for(int i=1;i<=n;i++)
{
if(c[i]<d[i]) f=0;
}
if(!f)
{
cout<<0<<"\n";
return ;
}
dsu.init();
rec();
cout<<f<<"\n";
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--)
{
solve();
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |