/**
　　　　　／＞　 フ
　　　　　| 　_　 _|
　 　　　／`ミ _x 彡 
　　 　 /　　　 　 |
　　　 /　  ヽ　　 ﾉ
　／￣|　　 |　|　|
　| (￣ヽ＿_ヽ_)_)
　＼二つ
**/
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
#include <iostream> 
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <string>
#include <queue>
#include <set>
#include <map>
#include <iomanip>
#include <deque>
#include <map>

using namespace std;
 
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
 
typedef long long ll;

#define forn for(int i=0;i<n;i++) 
#define pb push_back 
#define sc second 
#define f first 
#define kek cout<<"\n"; 
#define all(v) ((v).begin()), ((v).end()) 

const int MAXN=100010;
const int MOD=1e9+7;
const int INF=1e9+10;
#define int ll

int raz(int a, int b)
{
    return (a+b-1)/b;
} 

int32_t main()
{
  
 ios_base::sync_with_stdio(false);
 cin.tie(0);
 cout.tie(0);
 
 int tt=1;
 // cin>>tt;
 while(tt--)
 {
     // solution goes here
     int n,m;
     cin>>n>>m;
     vector<int> v(n);
     forn cin>>v[i];
     set<int> need;
     set<int> was;
     map<int,int> ma;
     for(int i=0;i<m;i++) 
     {
         ma[v[i]]++;
         was.insert(v[i]);
     }
     for(int i=0;i<=n;i++) 
     {
         if(!was.count(i)) need.insert(i);
     }
     int ans=*need.begin();
     for(int i=1;i<n;i++) 
     {
         if(i+m-1>=n) break;
         ma[v[i-1]]--;
         if(!ma[v[i-1]]) need.insert(v[i-1]);
         ma[v[i+m-1]]++;
         if(need.count(v[i+m-1])) need.erase(v[i+m-1]);
         ans=min(ans, *need.begin());
     }
     cout<<ans;
     
 }
 
   return 0;
}
#include <bits/stdc++.h>
using namespace std;
 

 #define int long long
int n, m, mx = -1e18; 

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> n >> m; 
    vector<int> graph[n], cost(n);
    for (int i = 0; i < n; i++) {
       cin >> cost[i]; 
    } 
    for (int i = 0; i < m; i++) {
        int a, b;
        cin >> a >> b;
        graph[b - 1].push_back(a - 1); 
    }
    for (int i = 0; i < n; i++) {
        int mn = 1e18; 
        for (int j : graph[i]) {
            mn = min(mn, cost[j]); 
        }
        mx = max(mx, cost[i] - mn); 
        cost[i]  = min(cost[i], mn); 
    }
    cout << mx << endl;
    return 0;
}
