#include "werewolf.h"
#include <bits/stdc++.h>
using namespace std;
 
typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vii;
typedef pair<int,int> pi;
typedef vector<pi> pii;
typedef tuple<int,int,int> ti;
typedef vector<ll> li;
typedef vector<li> lii;
 
#define REP(i,a,b) for(int i=a;i<b;i++)
#define F first
#define S second
#define PB push_back
#define LSOne(s) ((s)&(-s))
#define all(x) x.begin(),x.end()
 
ll INF=1000000000000000010;
int inf=1e9+10;
ll M=1e9+7;
vii a,b,c,d,e;
int n,m,pos;
vi p,arr,brr;
vector<set<int>> st;
int parent(int x){
  if(p[x]==x)return x;
  else return p[x]=parent(p[x]);
}
void merge(int x,int y,int z){
  p[y]=z;
  p[x]=z;
}
void dfs(int x,vii &ed,vi &ar,vii &par,vi &P,vi &C){
  if(x<n){
    ar.PB(x);
    C[x]=ar.size()-1;
  }
  for(auto u:ed[x])if(par[x][0]!=u){
    dfs(u,ed,ar,par,P,C);
    P[x]+=P[u];
    C[x]=min(C[x],C[u]);
  }
}
void build(int x,int l,int r){
  if(l==r){
    st[x].insert(brr[l]);
    return;
  }
  int m=(l+r)/2;
  build(2*x,l,m);
  build(2*x+1,m+1,r);
  for(auto u:st[2*x])st[x].insert(u);
  for(auto u:st[2*x+1])st[x].insert(u);
}
bool query(int x,int l,int r,int u,int v,int t1,int t2){
  if(u>v)return 0;
  if(l==u&&r==v){
    auto it=st[x].lower_bound(t1);
    if(it==st[x].end())return 0;
    return (*it<=t2);
  }
  int m=(l+r)/2;
  return (query(2*x,l,m,u,min(m,v),t1,t2)||query(2*x+1,m+1,r,max(u,m+1),v,t1,t2));
}
std::vector<int> check_validity(int N, std::vector<int> X, std::vector<int> Y,
                                std::vector<int> S, std::vector<int> E,
                                std::vector<int> L, std::vector<int> R) {
  m=S.size();
  n=N;
  a.resize(n);
  vi ans(m,0);
  REP(i,0,X.size()){
    a[X[i]].PB(Y[i]);
    a[Y[i]].PB(X[i]);
  }
  vi P(2*n+1,0),Q(2*n+1,0),A(2*n+1,inf),B(2*n+1,-inf),C(2*n+1,inf),D(2*n+1,inf);
  REP(i,0,n)A[i]=i;REP(i,0,n)B[i]=i;
  REP(i,0,n)P[i]=1;REP(i,0,n)Q[i]=1;
  p.resize(2*n+1);
  REP(i,0,2*n+1)p[i]=i;
  int k=log2(2*n+1)+1;
  d.resize(2*n+1,vi(k,-1));e.resize(2*n+1,vi(k,-1));
  b.resize(2*n+1);c.resize(2*n+1);
  pos=n;
  for(int i=n-1;i>=0;i--){
    set<int> st;
    for(auto u:a[i])if(u>i)st.insert(parent(u));
    for(auto u:st){
      merge(u,i,pos);
      d[u][0]=pos;
      b[pos].PB(u);
      A[pos]=min(A[pos],A[u]);
    }
    d[i][0]=pos;
    b[pos].PB(i);
    A[pos]=min(A[pos],A[i]);
    pos++;
  }
  dfs(pos-1,b,arr,d,P,C);
  pos=n;
  p.clear();p.resize(2*n+1);
  REP(i,0,2*n+1)p[i]=i;
  REP(i,0,n){
    set<int> st;
    for(auto u:a[i])if(u<i)st.insert(parent(u));
    for(auto u:st){
      merge(u,i,pos);
      e[u][0]=pos;
      c[pos].PB(u);
      B[pos]=max(B[pos],B[u]);
    }
    e[i][0]=pos;
    c[pos].PB(i);
    B[pos]=max(B[pos],B[i]);
    pos++;
  }
  dfs(pos-1,c,brr,e,Q,D);
  REP(j,1,k)REP(i,0,2*n+1)if(d[i][j-1]!=-1)d[i][j]=d[d[i][j-1]][j-1];
  REP(j,1,k)REP(i,0,2*n+1)if(e[i][j-1]!=-1)e[i][j]=e[e[i][j-1]][j-1];
  st.resize(4*n+1);
  vi tmp(n);
  REP(i,0,n)tmp[arr[i]]=i;
  REP(i,0,n)brr[i]=tmp[brr[i]];
  build(1,0,n-1);
  REP(i,0,m){
    int x=L[i],y=R[i],p1=S[i],p2=E[i];
    for(int j=k-1;j>=0;j--)if(d[p1][j]!=-1&&A[d[p1][j]]>=x)p1=d[p1][j];
    for(int j=k-1;j>=0;j--)if(e[p2][j]!=-1&&B[e[p2][j]]<=y)p2=e[p2][j];
    if(query(1,0,n-1,D[p2],D[p2]+Q[p2]-1,C[p1],C[p1]+P[p1]-1))ans[i]=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... |