#include <iostream>
#include <bits/stdc++.h>
using namespace std;
typedef   long long int ll;
typedef long double db;
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
template <typename T>
using ordered_multiset = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;
template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
#define pll pair<ll,ll>
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define ub(v,val) upper_bound(v.begin(),v.end(),val)
#define np(str) next_permutation(str.begin(),str.end())
#define lb(v,val) lower_bound(v.begin(),v.end(),val)
#define sortv(vec) sort(vec.begin(),vec.end())
#define rev(p) reverse(p.begin(),p.end());
#define v vector
#define pi 3.14159265358979323846264338327950288419716939937510
#define len length()
#define repc(i,s,e) for(ll i=s;i<e;i++)
#define fi first
#define se second
#define mset(a,val) memset(a,val,sizeof(a));
#define mt make_tuple
#define repr(i,n) for(i=n-1;i>=0;i--)
#define rep(i,n) for(i=0;i<n;i++)
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define at(s,pos) *(s.find_by_order(pos))
#define set_ind(s,val) s.order_of_key(val)
long long int M = 1e9 + 7 ;
long long int inf = 9 * 1e18;
//CLOCK
ll begtime = clock();
#define time() cout << "\n\nTime elapsed: " << (clock() - begtime)*1000/CLOCKS_PER_SEC << " ms\n\n";
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
//CLOCK ENDED
ll n, m;
// modular exponentiation
ll binpow(ll val, ll deg)
{
	if (deg < 0)
		return 0;
	if (!deg)
		return 1 % M;
	if (deg & 1)
		return binpow(val, deg - 1) * val % M;
	ll res = binpow(val, deg >> 1);
	return (res * res) % M;
}
//binomial
ll modinv(ll n) {
	return binpow(n, M - 2);
}

int main() {
	// your code goes here
	IOS;
#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#endif
	ll i, j, t, k, x, y, z,  N;
	cin >> n >> m;
	ll a[n];
	rep(i, n) {
		cin >> a[i];
	}
	ll cnt[n] = {0};
	set<ll> s;
	rep(i, n + 1) {
		s.insert(i);
	}
	rep(i, m) {
		s.erase(a[i]);
		cnt[a[i]]++;
	}
	ll mn = *s.begin();
	for (i = m; i < n; i++) {
		cnt[a[i - m]]--;
		if (cnt[a[i - m]] == 0) s.insert(a[i - m]);
		s.erase(a[i]);
		cnt[a[i]]++;
		mn = min(mn, *s.begin());
	}
	cout << mn;


	return 0;



}









#include<bits/stdc++.h>
using namespace std;
int a[2000001],sum[2000001],b[2000001];
int n,m,answ=99999999;
void add(int x,int v)
{
	while(x<=n+1)
	{
		a[x]+=v;
		x+=x&-x;
	}
}
int find(int x)
{
	int ans=0;
	while(x)
	{
		ans+=a[x];
		x-=x&-x;
	}
	return ans;
}
int query()
{
	int l=1,r=n+2,mid,ans=n+1;
	while(l<=r)
	{
		mid=(l+r)>>1;
		if(find(mid)==mid)l=mid+1;
		else r=mid-1,ans=mid;
	}
	return ans;
}
signed main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>b[i];
		b[i]++;
		sum[b[i]]++;
		if(sum[b[i]]==1)add(b[i],1);
		if(i-m>=1){sum[b[i-m]]--;if(!sum[b[i-m]])add(b[i-m],-1);}
		if(i-m+1>=1)answ=min(answ,query());
	}
	cout<<answ-1;
} 