#include <iostream>
#include "obstacles.h"
#define fi first
#define se second
#define ll long long
#define pb push_back
using namespace std;
const int N=200005;
int st[4*N];
int g[N];
int t[N],h[N];
int n,MAXT=0;
void build(int x, int xl, int xr){
if(xl==xr){
st[x]=h[xl];
return;
}
int mid=(xl+xr)/2;
build(x*2+1,xl,mid);
build(x*2+2,mid+1,xr);
st[x]=max(st[x*2+1],st[x*2+2]);
return;
}
int f(int x, int xl, int xr, int l, int r){
if(xl>=l && xr<=r) return st[x];
if(xr<l || xl>r) return 0;
int mid=(xl+xr)/2;
return max(f(x*2+1,xl,mid,l,r),f(x*2+2,mid+1,xr,l,r));
}
void initialize(vector<int> T, vector<int> H) {
for(int i=0; i<T.size(); i++){
t[i]=T[i];
MAXT=max(MAXT,t[i]);
}
for(int i=0; i<H.size(); i++){
h[i]=H[i];
if(h[i]==0) g[i]=1;
}
for(int i=1; i<n; i++){
if(g[i-1]) g[i]=1;
}
for(int i=n-2; i>=0; i--){
if(g[i+1]) g[i]=1;
}
n=H.size();
build(0,0,n-1);
return;
}
bool can_reach(int L, int R, int S, int D) {
int l=L,r=R,s=S,d=D;
if(s>d) swap(s,d);
if(s==d || s+1==d) return 1;
int mah=f(0,0,n-1,s+1,d-1);
if(mah>=3) return 0;
if(mah<2) return 1;
if(g[s] && g[d]) return 1;
return 0;
}
/*
3 4
2 1 3
0 1 2 0
1
0 3 1 3
*/