#include <bits/stdc++.h>
#define MOD 1000000007LL
using namespace std;

typedef long long ll;
typedef pair<int,int> P;

const int N=(1<<20);
int dat[1<<21];
int lazy[1<<21];

void lazy_upd(int k,int l,int r){
	dat[k]+=lazy[k]*(r-l);
	if(k<N-1){
		lazy[k*2+1]+=lazy[k];
		lazy[k*2+2]+=lazy[k];
	}
	lazy[k]=0;
}

void lazy_calc(int k){
	dat[k]=dat[k*2+1]+dat[k*2+2];
}

void add(int a,int b,int x,int k=0,int l=0,int r=N){
	lazy_upd(k,l,r);
	if(r<=a || b<=l)return;
	if(a<=l && r<=b){
		lazy[k]+=x;
		lazy_upd(k,l,r);
		return;
	}
	add(a,b,x,k*2+1,l,(l+r)/2);
	add(a,b,x,k*2+2,(l+r)/2,r);
	lazy_calc(k);
}

int query(int a,int b,int k=0,int l=0,int r=N){
	lazy_upd(k,l,r);
	if(r<=a || b<=l)return 0;
	if(a<=l && r<=b)return dat[k];
	int vl=query(a,b,k*2+1,l,(l+r)/2);
	int vr=query(a,b,k*2+2,(l+r)/2,r);
	lazy_calc(k);
	return vl+vr;
}

vector<int> xi;
int n;
int x[1000001];

bool check(int v){
	if(query(0,1)==1)return false;
	int v1=query(1,v+1);
	int v2=query(v+1,N);
	if(v1==v && v2>0)return false;
	return true;
}

void puts(int v){
	int l=0,r=v+1;
	while(l+1<r){
		int mid=(l+r)/2;
		if(query(mid,v+1)==v+1-mid)r=mid;
		else l=mid;
	}
	add(r,v+1,-1);
	add(r-1,r,1);
}

int main(void){
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&x[i]);
		xi.push_back(x[i]);
	}
	for(int i=0;i<=500000;i++){
		xi.push_back(i);
	}
	sort(xi.begin(),xi.end());
	xi.erase(unique(xi.begin(),xi.end()),xi.end());
	for(int i=0;i<n;i++){
		x[i]=lower_bound(xi.begin(),xi.end(),x[i])-xi.begin();
	}
	for(int i=0;i<n;i++){
		if(check(x[i])){
			printf("Yes\n");
			puts(x[i]);
		}else{
			printf("No\n");
		}
	}
	return 0;
}
### Prompt

Your challenge is to write a CPP solution to the following problem:

Example

Input

6
2
3
1
1
4
2


Output

Yes
Yes
Yes
No
Yes
No

### Response

```cpp
#include <bits/stdc++.h>
#define MOD 1000000007LL
using namespace std;

typedef long long ll;
typedef pair<int,int> P;

const int N=(1<<20);
int dat[1<<21];
int lazy[1<<21];

void lazy_upd(int k,int l,int r){
	dat[k]+=lazy[k]*(r-l);
	if(k<N-1){
		lazy[k*2+1]+=lazy[k];
		lazy[k*2+2]+=lazy[k];
	}
	lazy[k]=0;
}

void lazy_calc(int k){
	dat[k]=dat[k*2+1]+dat[k*2+2];
}

void add(int a,int b,int x,int k=0,int l=0,int r=N){
	lazy_upd(k,l,r);
	if(r<=a || b<=l)return;
	if(a<=l && r<=b){
		lazy[k]+=x;
		lazy_upd(k,l,r);
		return;
	}
	add(a,b,x,k*2+1,l,(l+r)/2);
	add(a,b,x,k*2+2,(l+r)/2,r);
	lazy_calc(k);
}

int query(int a,int b,int k=0,int l=0,int r=N){
	lazy_upd(k,l,r);
	if(r<=a || b<=l)return 0;
	if(a<=l && r<=b)return dat[k];
	int vl=query(a,b,k*2+1,l,(l+r)/2);
	int vr=query(a,b,k*2+2,(l+r)/2,r);
	lazy_calc(k);
	return vl+vr;
}

vector<int> xi;
int n;
int x[1000001];

bool check(int v){
	if(query(0,1)==1)return false;
	int v1=query(1,v+1);
	int v2=query(v+1,N);
	if(v1==v && v2>0)return false;
	return true;
}

void puts(int v){
	int l=0,r=v+1;
	while(l+1<r){
		int mid=(l+r)/2;
		if(query(mid,v+1)==v+1-mid)r=mid;
		else l=mid;
	}
	add(r,v+1,-1);
	add(r-1,r,1);
}

int main(void){
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&x[i]);
		xi.push_back(x[i]);
	}
	for(int i=0;i<=500000;i++){
		xi.push_back(i);
	}
	sort(xi.begin(),xi.end());
	xi.erase(unique(xi.begin(),xi.end()),xi.end());
	for(int i=0;i<n;i++){
		x[i]=lower_bound(xi.begin(),xi.end(),x[i])-xi.begin();
	}
	for(int i=0;i<n;i++){
		if(check(x[i])){
			printf("Yes\n");
			puts(x[i]);
		}else{
			printf("No\n");
		}
	}
	return 0;
}
```