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 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX 200002
#define max( a, b ) ( a > b? a:b )
#define min( a, b ) ( a < b? a:b )
void show( char *s, int Len ){
		for( int i = 0; i < Len; i++ )printf("%c%c", s[i], " \n"[i == Len-1]);
}

int main(){
		int N, A, B, C, D;scanf("%d%d%d%d%d", &N, &A, &B, &C, &D);
		char s[MAX];scanf("%s", s);
		//show( s, N );
		// A < B, if A can reacher, so do B
		// if A can go to D, B can to D too

		//station = ...
		int ptr = min(A, B);
		int end_ptr = max(C, D);
		int station = 0;
		while( ptr < end_ptr ){	
				int counter = 0;
				while( ptr < end_ptr && s[ptr] == '.' ){
						counter++;
						ptr++;	
				}
				ptr++;
				station = max( counter, station );
		}
		//if station == 3
		if( station >= 3 ){
				int start = min(A, B);
				int end = max(C, D)-1;
				for( int i = start; i < end; i++ )
						if( s[i] == '#' && s[i+1] == '#' ){
								puts("No");
								return 0;
						}
		}
		else{
				if( D > C ){
						for( int i = B; i < D; i++ ){
								if( s[i] == '#' && s[i+1] == '#' ){
										puts("No");
										return 0;
								}
						}
				}
				else{// C > D
						if( s[D-1-1] == '#' || s[D-1+1] == '#' ){
								puts("No");
								return 0;
						}
						for( int i = A; i < C; i++ ){
								if( s[i] == '#' && s[i+1] == '#' ){
										puts("No");
										return 0;
								}
						}
				}
		}
		puts("Yes");

}