Buggy python submission (verdict: Time Limit Exceeded):
###template###
import sys
def input(): return sys.stdin.readline().rstrip()
def mi(): return map(int, input().split())
###template###

N, A, B, C, D = mi()
#S[0~N-1]でアクセス
cells = input()

if C > D:
  c = C
  C = D
  D = c
  a = A
  A = B
  B = a

#全部0~N-1ベースにする
A -= 1
B -= 1
C -= 1
D -= 1

#既にスタック済みの座標の組(visited[0~N-1][0~N-1]でアクセス)
visited = [[0]*N for _ in range(N)]

st = []
#初期座標
st.append((A,B))

#結果が出るまでループする
#スタックから座標の組を取り出し、F>Sの優先順位で動かしてスタックに入れる

while 1:
  #選択肢がなくなったら、駄目だったと分かる
  try:
    s, f = st.pop()
  except:
    print('No')
    exit()

  #ここがゴールかどうか
  if s==C and f==D:
    print('Yes')
    exit()
  #Fが動けるかどうか
  fok = 0
  try:
    if visited[s][f+1]==0 and cells[f+1]=='.' and s != f+1:
      st.append((s,f+1))
      visited[s][f+1] = 1
      fok = 1
      continue
  except:
    pass
  try:
    if visited[s][f+2]==0 and cells[f+2]=='.' and s != f+2:
      st.append((s,f+2))
      visited[s][f+2] = 1
      fok = 1
  except:
    pass
  #Fが動けなかった場合のみSが動く
  if fok == 0:
    try:
      if visited[s+2][f]==0 and cells[s+2]=='.' and s+2 != f:
        st.append((s+2,f))
        visited[s+2][f] = 1
        fok = 1
    except:
      pass
    try:
      if visited[s+1][f]==0 and cells[s+1]=='.' and s+1 != f:
        st.append((s+1,f))
        visited[s+1][f] = 1
        fok = 1
    except:
      pass

Fixed submission:
###template###
import sys
def input(): return sys.stdin.readline().rstrip()
def mi(): return map(int, input().split())
###template###

N, A, B, C, D = mi()
#S[0~N-1]でアクセス
cells = input()

#全部0~N-1ベースにする
A -= 1
B -= 1
C -= 1
D -= 1

ans = '?'

goal = max(C,D)


rockcheck = 0 #直前が岩なら1
for i, cell in enumerate(cells):
  if i < A or goal < i: continue
  if rockcheck == 1 and cell == '#':
    ans = 'No'
    break
  elif cell == '#': rockcheck = 1
  else: rockcheck = 0

#C<Dならflag=0, D<Cならflag=1
if C < D: flag = 0
else: flag = 1

if ans == 'No':
  print('No')
  exit()
elif flag == 0: #C<Dならこの時点で勝ち確
  print('Yes')
  exit()
#そうでなければ戦いは続く

ans = 'No'
#C<Dの場合決着がついているので、ここからは必ずD<C
#かつ、##は無いことが保証されている
blankcheck = 0 #直前が.なら1, 直前が..なら2
for i, cell in enumerate(cells):
  if i < (B-1) or (D+1) < i: continue
  if cell == '.': blankcheck += 1
  else: blankcheck = 0
  if blankcheck == 3:
    ans = 'Yes'
    break

print(ans)

Buggy python submission (verdict: Time Limit Exceeded):
###template###
import sys
def input(): return sys.stdin.readline().rstrip()
def mi(): return map(int, input().split())
###template###

N, A, B, C, D = mi()
#S[0~N-1]でアクセス
cells = input()

if C > D:
  c = C
  C = D
  D = c
  a = A
  A = B
  B = a

#全部0~N-1ベースにする
A -= 1
B -= 1
C -= 1
D -= 1

#既にスタック済みの座標の組(visited[0~N-1][0~N-1]でアクセス)
visited = [[0]*N for _ in range(N)]

st = []
#初期座標
st.append((A,B))

#結果が出るまでループする
#スタックから座標の組を取り出し、F>Sの優先順位で動かしてスタックに入れる

while 1:
  #選択肢がなくなったら、駄目だったと分かる
  try:
    s, f = st.pop()
  except:
    print('No')
    exit()

  #ここがゴールかどうか
  if s==C and f==D:
    print('Yes')
    exit()
  #Fが動けるかどうか
  fok = 0
  try:
    if visited[s][f+2]==0 and cells[f+2]=='.' and s != f+2:
      st.append((s,f+2))
      visited[s][f+2] = 1
      fok = 1
  except:
    pass
  try:
    if visited[s][f+1]==0 and cells[f+1]=='.' and s != f+1:
      st.append((s,f+1))
      visited[s][f+1] = 1
      fok = 1
  except:
    pass
  #Fが動けなかった場合のみSが動く
  if fok == 0:
    try:
      if visited[s+2][f]==0 and cells[s+2]=='.' and s+2 != f:
        st.append((s+2,f))
        visited[s+2][f] = 1
        fok = 1
    except:
      pass
    try:
      if visited[s+1][f]==0 and cells[s+1]=='.' and s+1 != f:
        st.append((s+1,f))
        visited[s+1][f] = 1
        fok = 1
    except:
      pass

Fixed submission:
###template###
import sys
def input(): return sys.stdin.readline().rstrip()
def mi(): return map(int, input().split())
###template###

N, A, B, C, D = mi()
#S[0~N-1]でアクセス
cells = input()

#全部0~N-1ベースにする
A -= 1
B -= 1
C -= 1
D -= 1

ans = '?'

goal = max(C,D)


rockcheck = 0 #直前が岩なら1
for i, cell in enumerate(cells):
  if i < A or goal < i: continue
  if rockcheck == 1 and cell == '#':
    ans = 'No'
    break
  elif cell == '#': rockcheck = 1
  else: rockcheck = 0

#C<Dならflag=0, D<Cならflag=1
if C < D: flag = 0
else: flag = 1

if ans == 'No':
  print('No')
  exit()
elif flag == 0: #C<Dならこの時点で勝ち確
  print('Yes')
  exit()
#そうでなければ戦いは続く

ans = 'No'
#C<Dの場合決着がついているので、ここからは必ずD<C
#かつ、##は無いことが保証されている
blankcheck = 0 #直前が.なら1, 直前が..なら2
for i, cell in enumerate(cells):
  if i < (B-1) or (D+1) < i: continue
  if cell == '.': blankcheck += 1
  else: blankcheck = 0
  if blankcheck == 3:
    ans = 'Yes'
    break

print(ans)

Buggy python submission (verdict: Time Limit Exceeded):
###template###
import sys
def input(): return sys.stdin.readline().rstrip()
def mi(): return map(int, input().split())
###template###

N, A, B, C, D = mi()
#S[0~N-1]でアクセス
cells = input()

if C > D:
  c = C
  C = D
  D = c
  a = A
  A = B
  B = a

#全部0~N-1ベースにする
A -= 1
B -= 1
C -= 1
D -= 1

#既にスタック済みの座標の組(visited[0~N-1][0~N-1]でアクセス)
visited = [[0]*N for _ in range(N)]

from collections import deque
st = deque(maxlen=10000)
#初期座標
st.append((A,B))

#結果が出るまでループする
#スタックから座標の組を取り出し、F>Sの優先順位で動かしてスタックに入れる
num = 0
while num < 10000:
  num += 1
  #選択肢がなくなったら、駄目だったと分かる
  try:
    s, f = st.popleft()
  except:
    print('No')
    exit()

  #ここがゴールかどうか
  if s==C and f==D:
    print('Yes')
    exit()
  #Fが動けるかどうか
  fok = 0
  try:
    if visited[s][f+2]==0 and cells[f+2]=='.' and s != f+2:
      st.append((s,f+2))
      visited[s][f+2] = 1
      fok = 1
  except:
    pass
  try:
    if visited[s][f+1]==0 and cells[f+1]=='.' and s != f+1:
      st.append((s,f+1))
      visited[s][f+1] = 1
      fok = 1
  except:
    pass
  #Fが動けなかった場合のみSが動く
  if fok == 0:
    try:
      if visited[s+2][f]==0 and cells[s+2]=='.' and s+2 != f:
        st.append((s+2,f))
        visited[s+2][f] = 1
        fok = 1
    except:
      pass
    try:
      if visited[s+1][f]==0 and cells[s+1]=='.' and s+1 != f:
        st.append((s+1,f))
        visited[s+1][f] = 1
        fok = 1
    except:
      pass






Fixed submission:
###template###
import sys
def input(): return sys.stdin.readline().rstrip()
def mi(): return map(int, input().split())
###template###

N, A, B, C, D = mi()
#S[0~N-1]でアクセス
cells = input()

#全部0~N-1ベースにする
A -= 1
B -= 1
C -= 1
D -= 1

ans = '?'

goal = max(C,D)


rockcheck = 0 #直前が岩なら1
for i, cell in enumerate(cells):
  if i < A or goal < i: continue
  if rockcheck == 1 and cell == '#':
    ans = 'No'
    break
  elif cell == '#': rockcheck = 1
  else: rockcheck = 0

#C<Dならflag=0, D<Cならflag=1
if C < D: flag = 0
else: flag = 1

if ans == 'No':
  print('No')
  exit()
elif flag == 0: #C<Dならこの時点で勝ち確
  print('Yes')
  exit()
#そうでなければ戦いは続く

ans = 'No'
#C<Dの場合決着がついているので、ここからは必ずD<C
#かつ、##は無いことが保証されている
blankcheck = 0 #直前が.なら1, 直前が..なら2
for i, cell in enumerate(cells):
  if i < (B-1) or (D+1) < i: continue
  if cell == '.': blankcheck += 1
  else: blankcheck = 0
  if blankcheck == 3:
    ans = 'Yes'
    break

print(ans)

Buggy python submission (verdict: Time Limit Exceeded):
###template###
import sys
def input(): return sys.stdin.readline().rstrip()
def mi(): return map(int, input().split())
###template###

N, A, B, C, D = mi()
#S[0~N-1]でアクセス
cells = input()

if C > D:
  c = C
  C = D
  D = c
  a = A
  A = B
  B = a

#全部0~N-1ベースにする
A -= 1
B -= 1
C -= 1
D -= 1

#既にスタック済みの座標の組(visited[0~N-1][0~N-1]でアクセス)
visited = [[0]*N for _ in range(N)]

from collections import deque
st = deque(maxlen=10000)
#初期座標
st.append((A,B))

#結果が出るまでループする
#スタックから座標の組を取り出し、F>Sの優先順位で動かしてスタックに入れる
num = 0
while num < 10000:
  num += 1
  #選択肢がなくなったら、駄目だったと分かる
  try:
    s, f = st.popleft()
  except:
    print('No')
    exit()

  #ここがゴールかどうか
  if s==C and f==D:
    print('Yes')
    exit()
  #Fが動けるかどうか
  fok = 0
  try:
    if visited[s][f+2]==0 and cells[f+2]=='.' and s != f+2:
      st.append((s,f+2))
      visited[s][f+2] = 1
      fok = 1
  except:
    pass
  try:
    if visited[s][f+1]==0 and cells[f+1]=='.' and s != f+1:
      st.append((s,f+1))
      visited[s][f+1] = 1
      fok = 1
  except:
    pass
  #Fが動けなかった場合のみSが動く
  if fok == 0:
    try:
      if visited[s+2][f]==0 and cells[s+2]=='.' and s+2 != f:
        st.append((s+2,f))
        visited[s+2][f] = 1
        fok = 1
    except:
      pass
    try:
      if visited[s+1][f]==0 and cells[s+1]=='.' and s+1 != f:
        st.append((s+1,f))
        visited[s+1][f] = 1
        fok = 1
    except:
      pass






Fixed submission:
###template###
import sys
def input(): return sys.stdin.readline().rstrip()
def mi(): return map(int, input().split())
###template###

N, A, B, C, D = mi()
#S[0~N-1]でアクセス
cells = input()

#全部0~N-1ベースにする
A -= 1
B -= 1
C -= 1
D -= 1

ans = '?'

goal = max(C,D)


rockcheck = 0 #直前が岩なら1
for i, cell in enumerate(cells):
  if i < A or goal < i: continue
  if rockcheck == 1 and cell == '#':
    ans = 'No'
    break
  elif cell == '#': rockcheck = 1
  else: rockcheck = 0

#C<Dならflag=0, D<Cならflag=1
if C < D: flag = 0
else: flag = 1

if ans == 'No':
  print('No')
  exit()
elif flag == 0: #C<Dならこの時点で勝ち確
  print('Yes')
  exit()
#そうでなければ戦いは続く

ans = 'No'
#C<Dの場合決着がついているので、ここからは必ずD<C
#かつ、##は無いことが保証されている
blankcheck = 0 #直前が.なら1, 直前が..なら2
for i, cell in enumerate(cells):
  if i < (B-1) or (D+1) < i: continue
  if cell == '.': blankcheck += 1
  else: blankcheck = 0
  if blankcheck == 3:
    ans = 'Yes'
    break

print(ans)