Problem:
Score : 400 points

Problem Statement

There are N squares arranged in a row, numbered 1, 2, ..., N from left to right.
You are given a string S of length N consisting of . and #. If the i-th character of S is #, Square i contains a rock; if the i-th character of S is ., Square i is empty.

In the beginning, Snuke stands on Square A, and Fnuke stands on Square B.

You can repeat the following operation any number of times:

Choose Snuke or Fnuke, and make him jump one or two squares to the right. The destination must be one of the squares, and it must not contain a rock or the other person.

You want to repeat this operation so that Snuke will stand on Square C and Fnuke will stand on Square D.

Determine whether this is possible.

Constraints

4 \leq N \leq 200\ 000

S is a string of length N consisting of . and #.

1 \leq A, B, C, D \leq N

Square A, B, C and D do not contain a rock.

A, B, C and D are all different.

A < B

A < C

B < D

Input

Input is given from Standard Input in the following format:

N A B C D
S

Output

Print Yes if the objective is achievable, and No if it is not.

Sample Input 1

7 1 3 6 7
.#..#..

Sample Output 1

Yes

The objective is achievable by, for example, moving the two persons as follows. (A and B represent Snuke and Fnuke, respectively.)

A#B.#..

A#.B#..

.#AB#..

.#A.#B.

.#.A#B.

.#.A#.B

.#..#AB

Sample Input 2

7 1 3 7 6
.#..#..

Sample Output 2

No

Sample Input 3

15 1 3 15 13
...#.#...#.#...

Sample Output 3

Yes

Solution in Ruby (2.7.1) (judge verdict: Wrong Answer)

class Move
  attr_accessor :a, :b # move a to b
  def initialize(a,b)
    @a = a
    @b = b
    raise "bad ord" if a >= b
  end

  def intersect(other)
    c,d = other.a,other.b
    return nil if b < d
    other
  end
end

# a = Move.new(1,10)
# b = Move.new(5,12)
# c = Move.new(4,2)

# pp a.overwrap(b)
# pp a.intersect(b)
# pp a.exchange(b)
# pp a.overwrap(c)
# pp a.intersect(c)
# pp a.exchange(c)

class Problem
  attr_accessor :a, :b, :c, :d, :k, :n, :m, :h, :w, :s, :x, :y
  def initialize
    @n,@a,@b,@c,@d = gets.to_s.split.map{ |v| v.to_i }
    @s = gets.chomp
  end

  # 追い越しが無いなら、#が2個以上連続しなければよい
  # 追い越しがあるなら、上の条件に加えて、3つの連続した.が必要
  def solve
    if d < c # 追い越しあり
      !has_double(a,c) && !has_double(b,d) && triple_space(a,c)
    else
      !has_double(a,c) && !has_double(b,d)
    end
  end

  def substr(a,b)
    a -= 1
    b -= 1
    s[a..b]
  end

  def has_double(a,b)
    substr(a, b) =~ /##/
  end
  
  def triple_space(a,b)
    substr(a, b) =~ /\.\.\./   
  end

  def show(ans)
    puts ans ? "Yes" : "No"
  end
end

Problem.new.instance_eval do
  show(solve)
end