Submission #1295690

#TimeUsernameProblemLanguageResultExecution timeMemory
1295690jahongirColors (RMI18_colors)C++20
0 / 100
71 ms1020 KiB
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
 
#include <bits/stdc++.h>
using namespace std;
 
#define ll long long
#define pi pair<int,int>
#define vi vector<int>
#define pb push_back
#define all(a) a.begin(),a.end()


const int mxn = 1e5+1, mxa = 3e6;
vector<int> g[mxn], vec[mxn];
int pl[mxa],pr[mxa],st[mxa],node=0;
int cola[mxn],colb[mxn];
int par[mxn], root[mxn];

int find(int u){
	if(par[u]<0) return u;
	return par[u] = find(par[u]);
}

int update(int cur, int l, int r, int k){
	if(!cur) cur = ++node;
	if(l==r){st[cur]=1; return cur;}
	int m = (l+r)>>1;
	if(k <= m) pl[cur] = update(0,l,m,k);
	else pr[cur] = update(0,m+1,r,k);
	st[cur] = 1; return cur;
}

int merge(int cur1, int cur2){
	if(!cur1) return cur2;
	if(!cur2) return cur1;
	pl[cur1] = merge(pl[cur1],pl[cur2]);
	pr[cur1] = merge(pr[cur1],pr[cur2]);
	st[cur1] = st[pl[cur1]] + st[pr[cur1]];
	return cur1;
}

int get(int cur, int l, int r, int k){
	if(!cur) return 0;
	if(l==r) return st[cur];
	int m = (l+r)>>1;
	if(k <= m) return get(pl[cur],l,m,k);
	else return get(pr[cur],m+1,r,k);
}


void solve(){
	int n,m; cin >> n >> m;

	fill(g+1,g+n+1,vi{});
	fill(vec+1,vec+n+1,vi{});
	fill(st+1,st+node+1,0);
	fill(pl+1,pl+node+1,0);
	fill(pr+1,pr+node+1,0);
	fill(par+1,par+n+1,-1);
	fill(root+1,root+n+1,0);
	node = 0;

	for(int i = 1; i <= n; i++) cin >> cola[i];
	for(int j = 1; j <= n; j++){
		cin >> colb[j];
		vec[colb[j]].push_back(j);
	}

	for(int i = 1; i <= m; i++){
		int u,v; cin >> u >> v; 
		g[u].pb(v); g[v].pb(u);
	}


	for(int i = 1; i <= n; i++){
		if(cola[i] < colb[i]){
			cout << "0\n"; return;
		}
		root[i] = update(0,1,n,cola[i]);
	}

	for(int i = 1; i <= n; i++){
		for(auto u : vec[i]){
			for(auto v : g[u]) if(colb[v] <= i){
				int u1 = find(u), u2 = find(v);
				if(u1==u2) continue;
				if(par[u1]>par[u2]) swap(u1,u2);
				par[u1] += par[u2]; par[u2] = u1;

				root[u1] = merge(root[u1],root[u2]);
			}
		}

		for(auto u : vec[i]){
			int v = find(u);
			if(get(root[v],1,n,i)==0){
				cout << "0\n"; return;
			}
		}
	}

	cout << "1\n";
}
 
 
signed main(){
	cin.tie(0)->sync_with_stdio(0);
	int t = 1;
	cin >> t;
	for(int i = 0; i < t; i++){solve();}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...