inlinevoidInit(){ for(REG int i=2;i<=n;++i) Log[i]=Log[i>>1]+1; for(REG int i=1;i<=n;++i) Rmq[i][0]=i; for(REG int j=1;j<=Log[n];++j) for(REG int i=1;i<=n-(1<<(j-1))+1;++i) Rmq[i][j]=Min(Rmq[i][j-1],Rmq[i+(1<<(j-1))][j-1]); }
inlineintAsk(int l,int r){ int k=r-l+1; return Min(Rmq[l][Log[k]],Rmq[r-(1<<Log[k])+1][Log[k]]); }
inlinevoidPreWork(){ for(REG int i=1;i<=n;++i) f[i]=1ll*a[i]*(i-L[i])+f[L[i]]; for(REG int i=1;i<=n;++i) sf[i]=sf[i-1]+f[i]; for(REG int i=n;i;--i) g[i]=1ll*a[i]*(N[i]-i)+g[N[i]]; for(REG int i=n;i;--i) sg[i]=sg[i+1]+g[i]; }
voidWork(){ n=read(),q=read(); a[0]=a[n+1]=2e9; for(REG int i=1;i<=n;++i) a[i]=read(); Init(),getLN(),PreWork(); while(q--){ int l=read(),r=read(); int p=Ask(l,r); LL res=1ll*a[p]*(p-l+1)*(r-p+1); res+=sf[r]-sf[p]-f[p]*(r-p); res+=sg[l]-sg[p]-g[p]*(p-l); printf("%lld\n",res); } }