虽然但是为什么错啊 /ll
#include<bits/stdc++.h>
#define up(i,l,r) for(int i=l; i<=r; ++i)
#define dn(i,r,l) for(int i=r; i>=l; --i)
#define int long long
#define ls(p) (p<<1)
#define rs(p) (p<<1|1)
using namespace std;
const int N=1600010, nul=1, P=998244353;
int n, a[N], tr[N], add[N], mul[N], sum, tot, len[N], sp[N], ds[N];
inline void upd(int p) {
tr[p]=(tr[ls(p)]+tr[rs(p)])%P;
}
inline void down(int p) {
if(mul[p]!=nul) {
tr[ls(p)]=tr[ls(p)]*mul[p]%P, mul[ls(p)]=mul[ls(p)]*mul[p]%P;
tr[rs(p)]=tr[rs(p)]*mul[p]%P, mul[rs(p)]=mul[rs(p)]*mul[p]%P;
mul[p]=nul;
}
if(add[p]) {
tr[ls(p)]=(tr[ls(p)]+len[ls(p)]*add[p]%P)%P, add[ls(p)]=(add[ls(p)]+add[p])%P;
tr[rs(p)]=(tr[rs(p)]+len[rs(p)]*add[p]%P)%P, add[rs(p)]=(add[rs(p)]+add[p])%P;
add[p]=0;
}
}
void build(int p,int s,int e) {
mul[p]=nul;
if(s==e) { len[p]=(sp[s]-sp[s-1])%P; return; }
int mid=(s+e)>>1;
build(ls(p),s,mid), build(rs(p),mid+1,e);
len[p]=(len[ls(p)]+len[rs(p)])%P;
}
void multi(int p,int s,int e,int l,int r,int val) {
if(l>r) return;
if(l<=s&&e<=r) {
tr[p]=tr[p]*val%P, mul[p]=mul[p]*val%P, add[p]=add[p]*val%P;
return;
}
down(p);
int mid=(s+e)>>1;
if(l<=mid) multi(ls(p),s,mid,l,r,val);
if(r>mid) multi(rs(p),mid+1,e,l,r,val);
upd(p);
}
void addit(int p,int s,int e,int l,int r,int val) {
if(l<=s&&e<=r) {
tr[p]=(len[p]*val%P+tr[p])%P, add[p]=(add[p]+val)%P;
return;
}
down(p);
int mid=(s+e)>>1;
if(l<=mid) addit(ls(p),s,mid,l,r,val);
if(r>mid) addit(rs(p),mid+1,e,l,r,val);
upd(p);
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
up(i,1,n) cin >> a[i], ds[i]=a[i];
sort(ds+1,ds+1+n), sum=unique(ds+1,ds+1+n)-(ds+1);
up(i,1,sum) {
if(ds[i-1]+1!=ds[i]) sp[++tot]=ds[i]-1;
sp[++tot]=ds[i];
}
up(i,1,n) a[i]=lower_bound(sp+1,sp+1+tot,a[i])-sp;
build(1,1,tot), addit(1,1,tot,1,a[1],1);
up(i,2,n) {
sum=tr[1];
multi(1,1,tot,a[i]+1,tot,0);
multi(1,1,tot,1,a[i],-1);
addit(1,1,tot,1,a[i],sum);
}
cout << (tr[1]%P+P)%P;
return 0;
}