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 Java8 (OpenJDK 1.8.0) (judge verdict: Runtime Error)

package atcoder.agc034.a;

import java.util.Scanner;

/**
 * 
 * @author tmikami
 * 
 * solution:
 * 
 * prerequisite :
 *  if C=D -> "No" (impossible)
 *  if one of A-th, B-th, C-th, D-th place is "#" -> "No" (impossible)
 * 
 * case 1) C < D :
 *   if "##" block does not exist in the interval (A,C) and (B,D): -> "Yes"
 *   else: -> "No"
 *  
 * case 2) C > D :
 *   if "..." block does not exist in the interval [B-1,D+1] -> "No"
 *   else: -> same as case 1)
 *
 */
public class Main {

	/**
	 * problem solver
	 */
	public static class Problem {

		/**
		 * paramters
		 */
		private int N;
		private int A;
		private int B;
		private int C;
		private int D;
		private String S;

		/**
		 * constructor
		 */
		Problem() {
		}

		/**
		 * standard input
		 */
		void input() {
			Scanner sc = new Scanner(System.in);
			N = sc.nextInt();
			A = sc.nextInt();
			B = sc.nextInt();
			C = sc.nextInt();
			D = sc.nextInt();
			S = sc.next();
			sc.close();
			
			S = "_" + S;
		}


		/**
		 * solver
		 */
		void solve() {
			
			// prerequisite
			if ( C == D || S.charAt(A) == '#' || S.charAt(B) == '#' || S.charAt(C) == '#' || S.charAt(D) == '#') {
				System.out.println("No");
				return;
			}
			
			// case 2
			if ( C > D) {
				
				// check if "..." block exists in the interval [B-1,D+1] 
				boolean flag = false;
				for (int i=B-1; i<=D-1; i++) {
					// boost
					if ('#' == S.charAt(i+2)) {
						i+=2;
						continue;
					}

					if ("...".equals(S.substring(i,i+3))) {
						flag = true;
						break;
					}
				}
				if (!flag) {
					System.out.println("No");
					return;					
				}
			}
			
			// case 1
			// check if "##" block does not exist in the interval (A,C) and (B,D)
			boolean flag = true;
			for (int i=A+1;i<Math.max(C, D);i++) {
				if (i>=C && i<=B) continue;
				
				if ("##".equals(S.substring(i,i+2))) {
					flag = false;
					break;
				}				
				
			}
			
//			for (int i=A+1;i<C;i++) {
//				if ("##".equals(S.substring(i,i+2))) {
//					flag = false;
//					break;
//				}
//			}
//			for (int i=B+1;i<D;i++) {
//				if ("##".equals(S.substring(i,i+2))) {
//					flag = false;
//					break;
//				}
//			}
			
			if (flag) {
				System.out.println("Yes");
			} else {
				System.out.println("No");
			}
			
		}

	}

	public static void main(String args[]) {

		Problem p = new Problem();

		p.input();

		p.solve();
	}
}