#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

using namespace std;
#define m 1000000000
/*
	壊れたオーディオシグナル

	ナザン・Ｏ・デヴィスは集積システム学部の学生である。

	今日の授業予定はオーディオシグナルの処理である。ナザンは大量の宿題を与えられていた。
	宿題のうちの一つはオーディオシグナルを処理するプログラムを書くことである。彼は与えられた
	オーディオシグナルをメモリにコピーし、自宅に持って帰った。

	彼は宿題を始めたとき、不幸にもUSBメモリを床に落としてしまった。彼が
	ＵＳＢメモリの中身を確認したところ、オーディオシグナルは壊れてしまっていた。

	彼がコピーしたオーディオシグナルにはいくつか特徴がある。

	・オーディオシグナルはＮ個のサンプルのつながりである。
	・オーディオシグナル中の各サンプルは1からＮの番号が振られており、
	　整数値として表現されている。
	・奇数番号のサンプルは隣接するサンプル未満である。
	・偶数番号のサンプルは隣接するサンプルより大きい。

	彼はパニックに陥り、君に助けを求めた。彼のＵＳＢメモリからオーディオシグナルを
	復元しようとしたが、オーディオシグナルのサンプルのいくつかは壊れていて復元できなかった。
	運のいいことに、メタデータから全ての壊れたサンプルには同じ値があるようだ。

	君の課題は、USBメモリから抽出された壊れたオーディオシグナルを入力として受け取り、
	オーディオシグナルがただ一通りに復元できるかどうか調べるプログラムを書くことである。

	入力
	入力は複数のデータセットからなる。データセットの形式は以下で説明する。

	各データセットの一行目は一つの整数からなる。Mは与えられたオーディオシグナル中のサンプル数である。
	各データセットの二行目はN個のスペースで区切られた値からなる。i番目の値であるa_iは
	xであるか、-10^9から10^9までの整数である。i番目の壊れたオーディオシグナルのサンプルである。
	a_iが文字xである場合、それはオーディオシグナル中のi番目のサンプルが壊れていることを示す。
	それ以外の場合はi番目のサンプルを指す。

	入力の終わりは一つの0によって示される。
	これはデータセットに含まれない。

	データセットのコスは100以下であると想定してよい。

	出力
	各データセットについて、もとのオーディオシグナルがただ一通りに復元される場合には
	壊れたサンプルを一行に出力せよ。ありうる値が複数あるときには'ambiguous'を出力せよ。
	ありうる値が一つも存在しないときは'none'を出力せよ。

*/
void push(int pos, vector< int > *smp, vector< int > *nv) {
	if( pos > 0 ) {
		int tmp;
		tmp = smp->at( pos - 1 );
		if( tmp != 1 << 30 ) nv->push_back( tmp );
	}
	if( pos < smp->size() - 1 ) {
		int tmp;
		tmp = smp->at( pos + 1 );
		if( tmp != 1 << 30 ) nv->push_back( tmp );
	}
}

bool chk( vector<int> smp){
	bool flg = true;
	for(int i = 0; i < smp.size(); i++) {
		if( i == 0 ) {
			if( smp[i] >= smp[i + 1] )
					flg = false;
		} else if( i == smp.size() - 1 && i % 2 == 1 ){
			if( smp[i] <= smp[i - 1] ) {
				flg = false;
			}
		} else if( i == smp.size() - 1 && i % 2 == 0 ){
			if( smp[i] >= smp[i - 1] ) 
				flg = false;
		} else {
			if( i % 2 == 0 ) {
				if( smp[i] >= smp[i + 1] || smp[i] >= smp[i - 1] ) {
					flg = false;
				}
			} else {
				if( smp[i] <= smp[i + 1] || smp[i] <= smp[i - 1] ) {
					flg = false;
				}
			}
		}
	}
	return flg;
}

int main(void){
	//FILE* fp_in = freopen("data.txt", "r", stdin);
	
	while( 1 ){
		int n;
		cin >> n;
		if( n == 0 ) break;
		vector< int > pos;
		vector< int > smp;
		vector< int > nv_max;
		vector< int > nv_min;

		for(int i = 0; i < n; i++) {
			string str;
			cin >> str;
			if( str == "x" ) {
				smp.push_back( 1 << 30 );
				pos.push_back( i );
			} else {
				smp.push_back( atoi( str.c_str() ) );
			}
		}

		for(int i = 0; i < pos.size(); i++) {
			if( pos[i] % 2 == 0 ) {
				push( pos[i], &smp, &nv_min );
			} else {
				push( pos[i], &smp, &nv_max );
			}
		}

		

		//最大値最小値を求める
		int max = 1 << 30, min = 1 << 30;
		max *= -1;
		for(int i = 0; i < nv_min.size(); i++)
			if( min > nv_min[i] ) min = nv_min[i];
		for(int i = 0; i < nv_max.size(); i++)
			if( max < nv_max[i] ) max = nv_max[i];

		//cout << "   " << max << " " << min << endl;//<< " " << smp[1] << " " << smp[2] << endl;

		if( smp.size() == pos.size() ) {
			cout << "none" << endl;
		} else if( pos.size() == 0 ) {
			if( chk(smp) ) cout << "ambiguous" << endl;
			else cout << "none" << endl;
		} else if( ( nv_min.size() == 0 ) && ( min == -m + 1 ) ) {
			cout << -m << endl;
		} else if( ( nv_max.size() == 0 ) && ( max == m - 1 ) ) {
			cout << m << endl;
		} else {
			if( nv_min.size() == 0 || nv_max.size() == 0 ) {
				cout << "ambiguous" << endl;
			} else if( min - max == 2 ) {
				for(int i = 0; i < pos.size(); i++) {
					smp[pos[i]] = ( min + max ) / 2;
				}
				if( chk(smp) ) cout << ( min + max )/2 << endl;
				else cout << "none" << endl;
			} else if( min - max < 2 ) {
				cout << "none" << endl;
			} else {
				for(int i = 0; i < pos.size(); i++) {
					smp[pos[i]] = ( min + max ) / 2;
				}
				if( chk(smp) ) cout << "ambiguous" << endl;
				else cout << "none" << endl;
			}
		}

	}

	//while(1){}
    return 0;
}

Measured memory_bytes: 1264