#include<bits/stdc++.h>
#define ll long long
#define ull unsigned ll
#define ld long double
#define pb push_back
// #define int long long
#define f first
#define s second
#define pq priority_queue
#define fast ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define read_file freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);
using namespace std;
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
// using namespace __gnu_pbds;
// template<class T> using ordered_multiset = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;
// template<class T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
int M;
struct dsu{
vector<int> p;
void init(int n){
p.assign(n, -1);
}
int get(int u){
return (p[u]<0?u:p[u]=get(p[u]));
}
void merge(int u, int v){
if((u=get(u))==(v=get(v))) return;
if(-p[u]<-p[v]) swap(u, v);
p[u]+=p[v];
p[v]=u;
}
};
struct Matrix{
ll a[2][2]{};
int n;
void init(int n2){
n=n2;
}
void build(){
for(int i=0; i<n; i++) a[i][i]=1;
}
Matrix operator*(const Matrix& m2){
Matrix prod; prod.init(n);
for(int i=0; i<n; i++) for(int j=0; j<n; j++) for(int k=0; k<n; k++){
prod.a[i][k]+=(a[i][j]*m2.a[j][k])%M;
prod.a[i][k]%=M;
}
return prod;
}
};
struct segTree{
vector<Matrix> prod;
int n;
void init(int n2){
n=1; while(n<n2) n*=2;
prod.resize(2*n);
for(int i=0; i<2*n; i++) {prod[i].init(2); prod[i].build();}
}
void set(int i, const Matrix& m1, int c, int lc, int rc){
if(lc+1==rc) {prod[c]=m1; return;}
int m=(lc+rc)/2;
if(i<m) set(i, m1, 2*c+1, lc, m);
else set(i, m1, 2*c+2, m, rc);
prod[c]=prod[2*c+2]*prod[2*c+1];
}
void set(int i, const Matrix& m1){
set(i, m1, 0, 0, n);
}
};
void solve(){
int n; cin>>n>>M;
int a[n]; for(int i=0; i<n; i++) cin>>a[i];
int b[n]; for(int i=0; i<n; i++) b[i]=a[i];
sort(b, b+n);
map<int, int> comp;
int uncomp[n+1]{};
int cntr=0;
for(int i=0; i<n; i++){
if(comp.count(b[i])) continue;
comp[b[i]]=cntr;
uncomp[cntr]=b[i];
cntr++;
}
for(int i=0; i<n; i++) a[i]=comp[a[i]];
vector<vector<int>> inds(cntr);
for(int i=0; i<n; i++){
inds[a[i]].pb(i);
}
dsu d1; d1.init(n);
segTree seg1; seg1.init(n);
Matrix m1; m1.init(2); // normal
m1.a[0][0]=m1.a[0][1]=m1.a[1][0]=1;
Matrix m2; m2.init(2); // 3rd 1
m2.a[0][0]=2; m2.a[1][0]=1;
Matrix m3; m3.init(2); m3.build(); // useless
ll ans=0, sum=0;
for(int i=0; i<cntr; i++){
for(auto j:inds[i]){
if(j-1>=0&&a[j-1]<=i) d1.merge(j, j-1);
if(j-2>=0&&a[j-2]<=i) d1.merge(j, j-2);
if(j+1<n&&a[j+1]<=i) d1.merge(j, j+1);
if(j+2<n&&a[j+2]<=i) d1.merge(j, j+2);
// check j+1, j+2, j+3
int cntl=0;
if(j>=1&&a[j-1]<=i) cntl++;
if(cntl&&j>=2&&a[j-2]<=i) cntl++;
if(cntl==2&&j>=3&&a[j-3]<=i) cntl++;
if(cntl<=1) {
seg1.set(j, m3);
}
else if(cntl==2) {
seg1.set(j, m2);
}
else seg1.set(j, m1);
if(j+1<n&&a[j+1]<=i&&cntl>=2){
seg1.set(j+1, m1);
}
else if(j+1<n&&a[j+1]<=i&&cntl==1){
seg1.set(j+1, m2);
}
else if(j+1<n&&a[j+1]<=i){
seg1.set(j+1, m3);
}
if(j+2<n&&a[j+1]<=i&&a[j+2]<=i&&cntl>=1){
seg1.set(j+2, m1);
}
else if(j+2<n&&a[j+1]<=i&&a[j+2]<=i){
seg1.set(j+2, m2);
}
if(j+3<n&&a[j+1]<=i&&a[j+2]<=i&&a[j+3]<=i){
seg1.set(j+3, m1);
}
}
ll ansi=(d1.get(0)==d1.get(n-1)?(seg1.prod[0].a[0][0]-sum+M)%M:0);
ans+=(ansi*uncomp[i])%M; ans%=M;
sum+=ansi; sum%=M;
}
cout<<ans<<endl;
}
int32_t main() {
#ifndef ONLINE_JUDGE
read_file;
#endif
fast;
int t;
t=1;
// cin>>t;
while(t--){
solve();
}
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KI2RlZmluZSBsbCBsb25nIGxvbmcKI2RlZmluZSB1bGwgdW5zaWduZWQgbGwKI2RlZmluZSBsZCBsb25nIGRvdWJsZQojZGVmaW5lIHBiIHB1c2hfYmFjawovLyAjZGVmaW5lIGludCBsb25nIGxvbmcKI2RlZmluZSBmIGZpcnN0CiNkZWZpbmUgcyBzZWNvbmQKI2RlZmluZSBwcSBwcmlvcml0eV9xdWV1ZQojZGVmaW5lIGZhc3QgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKSxjaW4udGllKDApLGNvdXQudGllKDApCiNkZWZpbmUgcmVhZF9maWxlIGZyZW9wZW4oImlucHV0LnR4dCIsICJyIiwgc3RkaW4pOyBmcmVvcGVuKCJvdXRwdXQudHh0IiwgInciLCBzdGRvdXQpOwogCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKLy8gI2luY2x1ZGUgPGV4dC9wYl9kcy9hc3NvY19jb250YWluZXIuaHBwPgovLyAjaW5jbHVkZSA8ZXh0L3BiX2RzL3RyZWVfcG9saWN5LmhwcD4KLy8gdXNpbmcgbmFtZXNwYWNlIF9fZ251X3BiZHM7CiAKLy8gdGVtcGxhdGU8Y2xhc3MgVD4gdXNpbmcgb3JkZXJlZF9tdWx0aXNldCA9IHRyZWU8VCwgbnVsbF90eXBlLCBsZXNzX2VxdWFsPFQ+LCByYl90cmVlX3RhZywgdHJlZV9vcmRlcl9zdGF0aXN0aWNzX25vZGVfdXBkYXRlPjsKLy8gdGVtcGxhdGU8Y2xhc3MgVD4gdXNpbmcgb3JkZXJlZF9zZXQgPSB0cmVlPFQsIG51bGxfdHlwZSwgbGVzczxUPiwgcmJfdHJlZV90YWcsIHRyZWVfb3JkZXJfc3RhdGlzdGljc19ub2RlX3VwZGF0ZT47CgppbnQgTTsKc3RydWN0IGRzdXsKICAgIHZlY3RvcjxpbnQ+IHA7CiAgICB2b2lkIGluaXQoaW50IG4pewogICAgICAgIHAuYXNzaWduKG4sIC0xKTsKICAgIH0KICAgIGludCBnZXQoaW50IHUpewogICAgICAgIHJldHVybiAocFt1XTwwP3U6cFt1XT1nZXQocFt1XSkpOwogICAgfQogICAgdm9pZCBtZXJnZShpbnQgdSwgaW50IHYpewogICAgICAgIGlmKCh1PWdldCh1KSk9PSh2PWdldCh2KSkpIHJldHVybjsKICAgICAgICBpZigtcFt1XTwtcFt2XSkgc3dhcCh1LCB2KTsKICAgICAgICBwW3VdKz1wW3ZdOwogICAgICAgIHBbdl09dTsKICAgIH0KfTsKCnN0cnVjdCBNYXRyaXh7CiAgICBsbCBhWzJdWzJde307CiAgICBpbnQgbjsKICAgIHZvaWQgaW5pdChpbnQgbjIpewogICAgICAgIG49bjI7CiAgICB9CiAgICB2b2lkIGJ1aWxkKCl7CiAgICAgICAgZm9yKGludCBpPTA7IGk8bjsgaSsrKSBhW2ldW2ldPTE7CiAgICB9CiAgICBNYXRyaXggb3BlcmF0b3IqKGNvbnN0IE1hdHJpeCYgbTIpewogICAgICAgIE1hdHJpeCBwcm9kOyBwcm9kLmluaXQobik7CiAgICAgICAgZm9yKGludCBpPTA7IGk8bjsgaSsrKSBmb3IoaW50IGo9MDsgajxuOyBqKyspIGZvcihpbnQgaz0wOyBrPG47IGsrKyl7CiAgICAgICAgICAgIHByb2QuYVtpXVtrXSs9KGFbaV1bal0qbTIuYVtqXVtrXSklTTsKICAgICAgICAgICAgcHJvZC5hW2ldW2tdJT1NOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcHJvZDsKICAgIH0KfTsKCnN0cnVjdCBzZWdUcmVlewogICAgdmVjdG9yPE1hdHJpeD4gcHJvZDsKICAgIGludCBuOwogICAgdm9pZCBpbml0KGludCBuMil7CiAgICAgICAgbj0xOyB3aGlsZShuPG4yKSBuKj0yOwogICAgICAgIHByb2QucmVzaXplKDIqbik7CiAgICAgICAgZm9yKGludCBpPTA7IGk8MipuOyBpKyspIHtwcm9kW2ldLmluaXQoMik7IHByb2RbaV0uYnVpbGQoKTt9CiAgICB9CiAgICB2b2lkIHNldChpbnQgaSwgY29uc3QgTWF0cml4JiBtMSwgaW50IGMsIGludCBsYywgaW50IHJjKXsKICAgICAgICBpZihsYysxPT1yYykge3Byb2RbY109bTE7IHJldHVybjt9CgogICAgICAgIGludCBtPShsYytyYykvMjsKICAgICAgICBpZihpPG0pIHNldChpLCBtMSwgMipjKzEsIGxjLCBtKTsKICAgICAgICBlbHNlIHNldChpLCBtMSwgMipjKzIsIG0sIHJjKTsKCiAgICAgICAgcHJvZFtjXT1wcm9kWzIqYysyXSpwcm9kWzIqYysxXTsKICAgIH0KICAgIHZvaWQgc2V0KGludCBpLCBjb25zdCBNYXRyaXgmIG0xKXsKICAgICAgICBzZXQoaSwgbTEsIDAsIDAsIG4pOwogICAgfQp9OwoKdm9pZCBzb2x2ZSgpewogICAgaW50IG47IGNpbj4+bj4+TTsKICAgIGludCBhW25dOyBmb3IoaW50IGk9MDsgaTxuOyBpKyspIGNpbj4+YVtpXTsKICAgIGludCBiW25dOyBmb3IoaW50IGk9MDsgaTxuOyBpKyspIGJbaV09YVtpXTsKICAgIHNvcnQoYiwgYituKTsKCiAgICBtYXA8aW50LCBpbnQ+IGNvbXA7CiAgICBpbnQgdW5jb21wW24rMV17fTsKICAgIGludCBjbnRyPTA7CiAgICBmb3IoaW50IGk9MDsgaTxuOyBpKyspewogICAgICAgIGlmKGNvbXAuY291bnQoYltpXSkpIGNvbnRpbnVlOwogICAgICAgIGNvbXBbYltpXV09Y250cjsKICAgICAgICB1bmNvbXBbY250cl09YltpXTsKICAgICAgICBjbnRyKys7CiAgICB9CiAgICBmb3IoaW50IGk9MDsgaTxuOyBpKyspIGFbaV09Y29tcFthW2ldXTsKCiAgICB2ZWN0b3I8dmVjdG9yPGludD4+IGluZHMoY250cik7CiAgICBmb3IoaW50IGk9MDsgaTxuOyBpKyspewogICAgICAgIGluZHNbYVtpXV0ucGIoaSk7CiAgICB9CgogICAgZHN1IGQxOyBkMS5pbml0KG4pOwoKICAgIHNlZ1RyZWUgc2VnMTsgc2VnMS5pbml0KG4pOwoKICAgIE1hdHJpeCBtMTsgbTEuaW5pdCgyKTsgLy8gbm9ybWFsCiAgICBtMS5hWzBdWzBdPW0xLmFbMF1bMV09bTEuYVsxXVswXT0xOwogICAgTWF0cml4IG0yOyBtMi5pbml0KDIpOyAvLyAzcmQgMQogICAgbTIuYVswXVswXT0yOyBtMi5hWzFdWzBdPTE7CiAgICBNYXRyaXggbTM7IG0zLmluaXQoMik7IG0zLmJ1aWxkKCk7IC8vIHVzZWxlc3MKCiAgICBsbCBhbnM9MCwgc3VtPTA7CiAgICBmb3IoaW50IGk9MDsgaTxjbnRyOyBpKyspewogICAgICAgIGZvcihhdXRvIGo6aW5kc1tpXSl7CiAgICAgICAgICAgIGlmKGotMT49MCYmYVtqLTFdPD1pKSBkMS5tZXJnZShqLCBqLTEpOwogICAgICAgICAgICBpZihqLTI+PTAmJmFbai0yXTw9aSkgZDEubWVyZ2Uoaiwgai0yKTsKICAgICAgICAgICAgaWYoaisxPG4mJmFbaisxXTw9aSkgZDEubWVyZ2UoaiwgaisxKTsKICAgICAgICAgICAgaWYoaisyPG4mJmFbaisyXTw9aSkgZDEubWVyZ2UoaiwgaisyKTsKCiAgICAgICAgICAgIC8vIGNoZWNrIGorMSwgaisyLCBqKzMKICAgICAgICAgICAgaW50IGNudGw9MDsKICAgICAgICAgICAgaWYoaj49MSYmYVtqLTFdPD1pKSBjbnRsKys7CiAgICAgICAgICAgIGlmKGNudGwmJmo+PTImJmFbai0yXTw9aSkgY250bCsrOwogICAgICAgICAgICBpZihjbnRsPT0yJiZqPj0zJiZhW2otM108PWkpIGNudGwrKzsKCiAgICAgICAgICAgIGlmKGNudGw8PTEpIHsKICAgICAgICAgICAgICAgIHNlZzEuc2V0KGosIG0zKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmKGNudGw9PTIpIHsKICAgICAgICAgICAgICAgIHNlZzEuc2V0KGosIG0yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHNlZzEuc2V0KGosIG0xKTsKCgogICAgICAgICAgICBpZihqKzE8biYmYVtqKzFdPD1pJiZjbnRsPj0yKXsKICAgICAgICAgICAgICAgIHNlZzEuc2V0KGorMSwgbTEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYoaisxPG4mJmFbaisxXTw9aSYmY250bD09MSl7CiAgICAgICAgICAgICAgICBzZWcxLnNldChqKzEsIG0yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmKGorMTxuJiZhW2orMV08PWkpewogICAgICAgICAgICAgICAgc2VnMS5zZXQoaisxLCBtMyk7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICBpZihqKzI8biYmYVtqKzFdPD1pJiZhW2orMl08PWkmJmNudGw+PTEpewogICAgICAgICAgICAgICAgc2VnMS5zZXQoaisyLCBtMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZihqKzI8biYmYVtqKzFdPD1pJiZhW2orMl08PWkpewogICAgICAgICAgICAgICAgc2VnMS5zZXQoaisyLCBtMik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmKGorMzxuJiZhW2orMV08PWkmJmFbaisyXTw9aSYmYVtqKzNdPD1pKXsKICAgICAgICAgICAgICAgIHNlZzEuc2V0KGorMywgbTEpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxsIGFuc2k9KGQxLmdldCgwKT09ZDEuZ2V0KG4tMSk/KHNlZzEucHJvZFswXS5hWzBdWzBdLXN1bStNKSVNOjApOwoKICAgICAgICBhbnMrPShhbnNpKnVuY29tcFtpXSklTTsgYW5zJT1NOwogICAgICAgIHN1bSs9YW5zaTsgc3VtJT1NOwogICAgfQogICAgY291dDw8YW5zPDxlbmRsOwp9CgppbnQzMl90IG1haW4oKSB7CiAgICAjaWZuZGVmIE9OTElORV9KVURHRQogICAgICAgIHJlYWRfZmlsZTsKICAgICNlbmRpZgoKICAgIGZhc3Q7CgogICAgaW50IHQ7CiAgICB0PTE7CiAgICAvLyBjaW4+PnQ7CiAgICB3aGlsZSh0LS0pewogICAgICAgIHNvbHZlKCk7CiAgICB9CiAgICByZXR1cm4gMDsKfQ==