思路
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define p MOD
using namespace std;
int read()
{
char ch=' ';
int f=1;int x=0;
while(ch<'0'||ch>'9')
{
if(ch=='-') f=-1;ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-'0';ch=getchar();
}
return x*f;
}
const int N=1e5+100;
const int MOD=998244353;
int a[N];
int ans=0;
int mn[N],mx[N],s1[N],s2[N],s3[N];
void work(int l,int r)
{
if(l==r)
{
ans=(ans+1ll*a[l]*a[l]%p)%p;
return ;
}
int mid=(l+r) >> 1;
mn[mid]=a[mid];mx[mid]=a[mid];
for(int i=mid-1;i>=l;i--)
{
mn[i]=min(mn[i+1],a[i]);
mx[i]=max(mx[i+1],a[i]);
}
mn[mid+1]=a[mid+1];mx[mid+1]=a[mid+1];
for(int i=mid+2;i<=r;i++)
{
mn[i]=min(mn[i-1],a[i]);
mx[i]=max(mx[i-1],a[i]);
}
cout<<l<<' '<<r<<endl;
for(int i=l;i<=r;i++)
{
cout<<mn[i]<<' ';
}
cout<<endl;
s1[mid]=0;s2[mid]=0;s3[mid]=0;
for(int i=mid+1;i<=r;i++)
{
s1[i]=(s1[i-1]+mn[i])%p;
s2[i]=(s2[i-1]+mx[i])%p;
s3[i]=(s3[i-1]+1ll*mn[i]*mx[i]%p)%p;
}
int p1=mid+1,p2=mid+1;
for(int i=mid;i>=l;i--)
{
while(p1<=r&&mn[p1]>a[i]) p1++;
while(p2<=r&&mx[p2]<a[i]) p2++;
if(p1<p2)
{
ans=(ans+1ll* mn[i] * mx[i] %p *( p1 -mid -1)%p)%p;
ans = (ans + 1LL * mx[i] * (s1[p2 - 1] - s1[p1 - 1] + p) % p) % p;
ans = (ans + (s3[r] - s3[p2 - 1] + p) % p) % p;
} else
{
ans = (ans + 1LL * mn[i] * mx[i] % p * (p2 - mid - 1) % p) % p;
ans = (ans + 1LL * mn[i] * (s2[p1 - 1] - s2[p2 - 1] + p) % p) % p;
ans = (ans + (s3[r] - s3[p1 - 1] + p) % p) % p;
}
}
work(l,mid);
work(mid+1,r);
}
int main()
{
int n;
n=read();
int i;
for(i=1;i<=n;i++)
{
a[i]=read();
}
work(1,n);
cout<<ans<<endl;
return 0;
}