#include<iostream>
#include<algorithm>
#define block_len 1
using namespace std;
const int maxn=100002,mod=998244353;
int n,a[maxn];
pair<int,bool>b[maxn];
bool use[maxn];
int maxx[maxn],maxp[maxn],num[maxn],len;
int l(int x){return block_len*(x-1)+1;}
int r(int x){int y=block_len*x;return y>n?n:y;}
void rebuild_block(int x){
int maxxx=-1,maxpp,cnt=0;
for(int i=l(x);i<=r(x);i++){
if(!use[i])cnt++;
if(maxxx<a[i]&&!use[i])maxxx=a[i],maxpp=i;
}
maxx[x]=maxxx,maxp[x]=maxpp,num[x]=cnt;
}
void init(){
len=n/block_len+((n%block_len)!=0);
for(int i=1;i<=len;i++)rebuild_block(i);
}
pair<int,bool>find(){
int i=1,maxxx=-1,maxpp,block;
for(;i<=len&&r(i)<=n;i++){
if(maxxx<maxx[i]){
maxxx=maxx[i],maxpp=maxp[i],block=i;
}
}
for(int j=l(i);j<=n;j++){
if(maxxx<a[j])maxxx=maxx[i],maxpp=j,block=i;
}
bool flag=false;
for(int j=1;j<block;j++)if(num[j]!=0)flag=true;
for(int j=l(block);j<maxpp;j++){
if(!use[j])flag=true;
}
use[maxpp]=true;
rebuild_block(block);
return make_pair(maxpp,flag);
}
int f[maxn];bool g[maxn],fir[maxn];
int may[maxn],tlen[maxn];
int sol(int x){
if(x==n)return f[x]=1;
pair<int,bool>res=find();
g[res.first]=res.second;
return f[x]=((res.second?2:1)*sol(x+1))%mod;
}
int qpow(int x){
if(x==0)return 1;
if(x==1)return 2;
int y=qpow(x/2);
return ((y*y)%mod)*(x%2?2:1)%mod;
}
struct cmp{
bool operator()(pair<int,bool>cmp1,pair<int,bool>cmp2){
return cmp1.first>cmp2.first;
}
};
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
init();sol(1);
for(int i=1;i<=n;i++){
b[i]=make_pair(a[i],g[i]);
}
sort(b+1,b+1+n,cmp());
for(int i=1;i<=n;i++){
fir[i]=true;int j=i;
while(true){
if(b[j].first!=b[i].first)break;
if(j==n+1)break;
if(b[j].second)may[i]++;
tlen[i]++,j++;
}
i=j-1;
}
for(int i=n;i>=1;i--){
if(!fir[i])continue;
if(i+tlen[i]<=n){
f[i]-=f[i+tlen[i]]*(qpow(may[i])-may[i]-1);
}
}
cout<<f[1];
return 0;
}