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++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <bits/stdc++.h>
#include <cstdlib>  // abs() for integer 絶対値求めやつ
#include <cmath>    // abs() for float, and fabs()
#include <algorithm>
#include <vector>
#include <string>
#include<iomanip>//浮動小数点数を出力する制度の指定
//使い方　数値をnumとして　cout<<setprecision(n)<<num ;nは桁数
#define rep(i,n) for(int i = 0; i < (n);i++)
#define SORT(a) sort((a).begin(),(a).end())
#define rSORT(a) reverse((a).begin(),(a).end())
#define REV(a) reverse((a).begin(),(a).end())
using namespace std;
using ll =long long;
using db = double;
#define INF 2000000000
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return true; } return false; }
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return true; } return false; }
#define che(a,string) cout<<"//"<<string <<"=="<<(a)<<"//" <<endl;
bool IsInt(double a){int b = a/1;if(a==b){return true;}else {return false;}}
/*覚えてないことメaモ
  数値型から文字列に変換　to_string(number);これは簡単
  文字列から数値型に変換　stoi(number)
  文字列からllに変換　stoll(number)
  __gcd(a,b)は最大公約数を取ってくれる、aとb
  の大きい方をNとしたとき、計算量は log(N);
 */
const int mod = 1e9 + 7;
// pie = M_PI
//ここから書き始める
int main(){
	cout << setprecision(10);
	int n, a, b, c, d; 
	cin >> n >> a>> b >> c >> d;
	string s ; cin >> s;

		int bjudge = 1;
		int ajudge = 1;
		for(int i = b - 1; i < d ; i ++){
			if(s[i]=='#'&&s[i+1]=='#'){
				bjudge = 0;
			}
		}
		for(int i = a - 1; i < c ; i ++){
			if(s[i]=='#'&&s[i+1]=='#'){
				ajudge = 0;
			}
		}
		if(c<d&&ajudge&&bjudge){
			//cout<<"c<d"<<endl;
			cout << "Yes"<<endl;
			return 0 ;
		}
		else{//d<cのときは、連続して3つの空き地がd（dは含まない)より前にあればYesになれる
			if(c<=b&&ajudge&&bjudge){
				cout<<"Yes"<<endl;
				return 0;
			}
			int null = 0;
			//Bの1個手前から見て3連続で岩じゃなければいい。
			int x = b - 1; //Bの要素番号」
			for(int i = x - 1 ; i <= d - 2 ; i ++){
				if(s[i] == '.'){
					if(s[i+1]=='.'&&s[i+1+1]=='.'){
						null = 1;
					}
				}
			}
			if(ajudge&&bjudge&&null){
				//cout<<"null"<<endl;
				cout << "Yes"<<endl;
				return 0;
			}
		}
		cout << "No"<<endl;
}