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 C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;

public class Hello
{
    private const int MOD_N = 1000000000 + 7;

    public static void Main()
    {
        var list = Console.ReadLine().Split(' ');
        var n = int.Parse(list[0]);
        var a = int.Parse(list[1]);
        var b = int.Parse(list[2]);
        var c = int.Parse(list[3]);
        var d = int.Parse(list[4]);

        var s = Console.ReadLine();
        var routes = new int[n];
        routes[0] = s[0] == '#' ? -1 : 0;
        if (s[1] == '#')
        {
            routes[1] = -1;
        }
        else
        {
            routes[1] = 0;
            if (routes[0] != -1)
                ++routes[0];
        }

        for (int i = 2; i < routes.Length; ++i)
        {
            if (s[i] == '#')
            {
                routes[i] = -1;
            }
            else
            {
                routes[i] = 0;
                if (routes[i - 1] != -1)
                    ++routes[i - 1];
                if (routes[i - 2] != -1)
                    ++routes[i - 2];
            }
        }

        bool ac = true, bd = true, over = false;
        for (int i = a - 1, end = c - 1; i < end; ++i)
        {
            if (routes[i] == 0)
            {
                ac = false;
                break;
            }
        }

        over = c < d || routes[b - 2] == 2;
        for (int i = b - 1, end = d - 1; i < end; ++i)
        {
            if (routes[i] == 0)
            {
                bd = false;
                break;
            }
            else if (routes[i] == 2)
            {
                over = true;
            }
        }

        Console.WriteLine((ac && bd && over) ? "Yes" : "No");
    }

    private static int Comb(int m, int n)
    {
        var t = m - n;
        if (n > t)
            n = t;

        long numerator = 1;
        for (int i = 0; i < n; ++i)
        {
            numerator *= m - i;
            numerator %= MOD_N;
        }
        long denominator = 1;
        for (; n != 0; --n)
        {
            denominator *= n;
            denominator %= MOD_N;
        }

        var inv_denominator = ModInv((int)denominator, MOD_N);
        var ret = (int)(numerator * inv_denominator % MOD_N);

        return ret >= 0 ? ret : ret + MOD_N;
    }

    private static int ModInv(int a, int m)
    {
        int b = m, x = 1, y = 0;
        while (b != 0)
        {
            var t = a / b;
            a -= t * b;
            Swap(ref a, ref b);
            x -= t * y;
            Swap(ref x, ref y);
        }
        x %= m;
        return x >= 0 ? x : x + m;
    }

    private static void Swap<T>(ref T a, ref T b)
    {
        var t = a;
        a = b;
        b = t;
    }
}