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 Rust (1.15.1) (judge verdict: Wrong Answer)

#![allow(unused_imports)]

macro_rules! input {
    ($($name:ident : $t:tt),*,) => {
        input!($($name: $t),*)
    };
    ($($name:ident : $t:tt),*) => {
        let mut _scanned = ::_input::Scanned::new(::std::io::stdin(), 1024);
        $(
            let $name = unsafe { _read_value!(_scanned, $t) };
        )*
    };
}

macro_rules! _read_value {
    ($scanned:expr, ($($t:tt),*)) => {
        ($(_read_value!($scanned, $t)),*)
    };
    ($scanned:expr, 1based) => {
        _read_value!($scanned, usize) - 1
    };
    ($scanned:expr, [u8]) => {
        _read_value!($scanned, String).into_bytes()
    };
    ($scanned:expr, [$t:tt; $n:expr]) => {
        (0..$n).map(|_| _read_value!($scanned, $t)).collect::<Vec<_>>()
    };
    ($scanned:expr, $t:ty) => {
        $scanned.next::<$t>()
    };
}

mod _input {
    use std::fmt;
    use std::io::{self, Read};
    use std::str::{self, FromStr};

    pub struct Scanned {
        buf: Vec<u8>,
        pos: usize,
    }

    impl Scanned {
        pub fn new<R: Read>(mut input: R, estimated: usize) -> Self {
            let mut buf_ = Vec::with_capacity(estimated);
            let _ = io::copy(&mut input, &mut buf_).unwrap();
            debug_assert!(str::from_utf8(&buf_).is_ok());
            debug_assert!(buf_.iter().all(|&c| u32::from(c) <= 0x7F));
            Scanned { buf: buf_, pos: 0 }
        }

        #[inline]
        pub unsafe fn next<T: FromStr>(&mut self) -> T
        where
            T::Err: fmt::Debug,
        {
            let mut start = None;
            loop {
                match (self.buf[self.pos], start.is_some()) {
                    (b' ', true) | (b'\n', true) => break,
                    (_, true) | (b' ', false) | (b'\n', false) => self.pos += 1,
                    (_, false) => start = Some(self.pos),
                }
            }
            let target = &self.buf[start.unwrap()..self.pos];
            str::from_utf8_unchecked(target).parse().unwrap()
        }
    }
}

use std::collections::{BTreeMap, BTreeSet, BinaryHeap, HashMap, HashSet, VecDeque};
use std::io::{self, BufWriter, Read, Stderr, StderrLock, Stdout, StdoutLock, Write};
use std::iter::{self, Product, Sum};
use std::num::{ParseFloatError, ParseIntError};
use std::ops::{
    Add, AddAssign, BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Deref,
    DerefMut, Div, DivAssign, Mul, MulAssign, Neg, Not, Rem, RemAssign, Sub, SubAssign,
};
use std::str::{self, FromStr};
use std::{char, cmp, f32, f64, fmt, i16, i32, i64, i8, mem, thread, u16, u32, u64, u8};

fn main() {
    input! {
        _n: usize,
        a: 1based,
        b: 1based,
        c: 1based,
        d: 1based,
        s: [u8],
    }

    let s = &s;

    let p = if a <= b && b <= d && d <= c {
        run(s, a, b) && outrun(s, b + 1, d - 1) && run(s, d, c)
            || run(s, a, b) && outrun(s, b + 1, d) && run(s, d + 1, c)
            || run(s, a, b - 1) && outrun(s, b, d - 1) && run(s, d, c)
            || run(s, a, b - 1) && outrun(s, b, d) && run(s, d + 1, c)
    } else if b <= a && a <= c && c <= d {
        run(s, b, a) && outrun(s, a + 1, c - 1) && run(s, c, d)
            || run(s, b, a) && outrun(s, a + 1, c) && run(s, c + 1, d)
            || run(s, b, a - 1) && outrun(s, a, c - 1) && run(s, c, d)
            || run(s, b, a - 1) && outrun(s, a, c) && run(s, c + 1, d)
    } else if a <= c && b <= d {
        run(s, a, c) && run(s, b, d)
    } else {
        false
    };

    println!("{}", if p { "Yes" } else { "No" });
}

fn run(s: &[u8], p: usize, q: usize) -> bool {
    p <= q
        && p < s.len() - 1
        && q < s.len()
        && s[p + 1..q + 1]
            .windows(2)
            .all(|w| (w[0], w[1]) != (b'#', b'#'))
}

fn outrun(s: &[u8], p: usize, q: usize) -> bool {
    p <= q
        && p < s.len() - 1
        && q < s.len()
        && (q - p <= 2 && (s[p], s[q]) == (b'.', b'.')
            || s[p..q + 1]
                .windows(3)
                .any(|w| (w[0], w[1], w[2]) == (b'.', b'.', b'.')))
}