#include "werewolf.h"
#include <bits/stdc++.h>
//#include "grader.cpp"
using namespace std;
//#define int long long 
#define ld long double
#define show(x,y) cout << y << " " << #x << endl;
#define show2(x,y,i,j) cout << y << " " << #x << "  " << j << " " << #i << endl;
#define show3(x,y,i,j,p,q) cout << y << " " << #x << "  " << j << " " << #i << "  " << q << " " << #p << endl;
#define show4(x,y) for(auto it:y) cout << it << " "; cout << #x << endl;
typedef pair<int,int>pii;
mt19937_64 rng(chrono::system_clock::now().time_since_epoch().count());
vector<int>krt[400005]; //werewolf
vector<int>krt2[400005]; //human
int val[400005];
int val2[400005];
int ptr=0;
struct DSU{
	vector<int>e;
	vector<int>node;
	void init(int n){
		e=vector<int>(n,-1);
		for(int x=0;x<n;x++){
			node.push_back(x);
		}
	}
	
	int get(int x){
		return e[x]<0?x:get(e[x]);
	}
	
	bool unite(int index, int x, int y){
		int a=x;
		x=get(x); y=get(y);
		if(x==y) return 1;
		if(e[x]>e[y]) swap(x,y);
		e[x]+=e[y];
		if(index==1){
			//show2(ptr,ptr,node[y],node[y]);
			//show2(ptr,ptr,node[x],node[x]);
			krt[ptr].push_back(node[y]);
			krt[ptr].push_back(node[x]);
			val[ptr]=a;
		}
		else{
			krt2[ptr].push_back(node[x]);
			krt2[ptr].push_back(node[y]);
			val2[ptr]=a;
		}
		e[y]=x;
		node[x]=ptr;
		ptr++;
		return 0;
	}
};
vector<int>adj[200005];
int in[400005];
int out[400005];
int two[22][400005];
int tour=0;
void dfs(int index, int par){
	in[index]=++tour;
	for(int x=0;x<20;x++){
		if(two[x][index]==-1) continue;
		two[x+1][index]=two[x][two[x][index]];
	}
	for(auto it:krt[index]){
		if(it==par) continue;
		two[0][it]=index;
		dfs(it,index);
	}
	out[index]=tour;
}
int in2[400005];
int out2[400005];
int two2[22][400005];
void dfs2(int index, int par){
	//show(visited,index);
	in2[index]=++tour;
	for(int x=0;x<20;x++){
		if(two2[x][index]==-1) continue;
		two2[x+1][index]=two2[x][two2[x][index]];
	}
	for(auto it:krt2[index]){
		if(it==par) continue;
		two2[0][it]=index;
		dfs2(it,index);
	}
	out2[index]=tour;
}
//fenwick
int fw[400005];
void upd(int x, int y){
	while(x<400005){
		fw[x]+=y;
		x+=x&(-x);
	}
}
int sum(int x){
	int counter=0;
	while(x>0){
		counter+=fw[x];
		x-=x&(-x);
	}
	return counter;
}
int query(int x, int y){
	int a=sum(y)-sum(x-1);
	return a;
}
vector<int>storage[400005];
vector<array<int,4>>que[400005]; //l r sgn index
vector<int>check_validity(int n, vector<int>a, vector<int>b, vector<int>s, vector<int>e, vector<int>l, vector<int>r){
	int q=s.size();
	vector<int>ans(q,0);
	
	for(int x=0;x<a.size();x++){
		//show2(a[x],a[x],b[x],b[x]);
		adj[a[x]].push_back(b[x]);
		adj[b[x]].push_back(a[x]);
	}
	
	bool visited[n+5];
	memset(visited,0,sizeof(visited));
	DSU dsu;
	dsu.init(n+5);
	ptr=n;
	for(int x=0;x<n;x++){
		for(auto it:adj[x]){
			if(it<x){
				//show2(x,x,it,it);
				dsu.unite(1,x,it);
			}
		}
	}
	
	memset(two,-1,sizeof(two));
	memset(two2,-1,sizeof(two2));
	
	tour=0;
	dfs(ptr-1,-1);
	DSU dsu2;
	dsu2.init(n+5);
	ptr=n;
	for(int x=n-1;x>=0;x--){
		for(auto it:adj[x]){
			if(it>x){
				dsu2.unite(2,x,it);
			}
		}
	}
	
	tour=0;
	dfs2(ptr-1,-1);
	
	//for(int x=0;x<ptr;x++){
		//show2(x,x,in[x],in[x]);
	//}
	
	for(int x=0;x<q;x++){
		//break down to euler tour
		
		//werewolf
		int cur=e[x];
	
		for(int y=19;y>=0;y--){
			if(two[y][cur]==-1) continue;
			if(val[two[y][cur]]<=r[x]){
				cur=two[y][cur];
			}
		}
		
		pii range={in[cur],out[cur]};
		
		//human
		cur=s[x];
		for(int y=19;y>=0;y--){
			if(two2[y][cur]==-1) continue;
			if(val2[two2[y][cur]]>=l[x]){
				cur=two2[y][cur];
			}
		}
		pii range2={in2[cur],out2[cur]};
		
		que[range2.first-1].push_back({range.first,range.second,-1,x});
		que[range2.second].push_back({range.first,range.second,1,x});
	}
	
	for(int x=0;x<n;x++){
		//show2(in[x],in[x],in2[x],in2[x]);
		storage[in2[x]].push_back(in[x]);
	}	
	
	for(int x=0;x<=2*n;x++){
		//show(x,x);
		for(auto it:storage[x]){
			//show(it,it);
			upd(it,1);
		}
		
		for(auto it:que[x]){
			//cout << it[0] << " " << it[1] << " " << it[2] << " " << it[3] << endl;
			ans[it[3]]+=query(it[0],it[1])*it[2];
		}
	}	
	
	for(int x=0;x<q;x++){
		ans[x]=min(ans[x],1);
	}
	
	return ans;
}
| # | 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... |