Description

已知自然数1,2,...,N(1≤N≤10000)依次入栈(即a<b当且仅当a先于b入栈),问:序列C1,C2,...,CN是否为可能的出栈序列。

  例如:N=5时,3,4,2,1,5是一个可能的出栈序列,因为其可以按如下操作获得:push 1,push 2,push 3,pop,push 4,pop,pop,pop,push 5,pop

Input

 输入数据包含若干组测试样例。

  每组测试样例的第一行为整数N(1≤N≤10000);

  第二行为N个正整数,以空格隔开,为出栈序列;

  输入数据的末尾以一个0表示输入的结束。

Output

对于每组测试样例,输出结果为一行字符串。

  如给出的序列是可能的出栈序列,则输出"Yes",否则输出"No"。

  注意:区分大小写,引号本身不输出。

Sample Input

5

3 4 2 1 5

5

3 5 1 4 2

0

Sample Output

Yes

No

Hint

 



1 #include<stdio.h>
2 #include<iostream>
3 #include<stack>
4 using namespace std;
5 int main()
6 {
7 int n,a[10000],i,j,flag;
8 while(scanf("%d",&n)!=EOF)
9 {
10 if(n==0)
11 break;
12 stack<int>s;
13 flag=1;
14 for(i=0; i<n; i++)
15 {
16 scanf("%d",&a[i]);
17 }
18 for(i=1; i<a[0]; i++)
19 {
20 s.push(i);
21 }///搞定第一个数
22 for(j=1; j<n; j++)
23 {
24 if(a[j]>a[j-1])///后面的数大于前面的数
25 {
26 for(i=a[j-1]; i<=a[j]; i++)
27 {
28 s.push(i);
29 s.pop();
30 }
31 }
32 else
33 {
34
35 if(s.top()==a[j])
36 {
37 s.pop();
38 }
39 else
40 {
41 flag=0;
42 break;
43 }
44 }
45 }
46 if(flag==1)
47 printf("Yes\n");
48 else
49 printf("No\n");
50 }
51 return 0;
52 }