The little girl loves the problems on array queries very much.

One day she came across a rather well-known problem: you've got an array of $n$ elements (the elements of the array are indexed starting from 1); also, there are $q$ queries, each one is defined by a pair of integers $l_i$, $r_i$ $(1 \le l_i \le r_i \le n)$. You need to find for each query the sum of elements of the array with indexes from $l_i$ to $r_i$, inclusive.

The little girl found the problem rather boring. She decided to reorder the array elements before replying to the queries in a way that makes the sum of query replies maximum possible. Your task is to find the value of this maximum sum.
The first line contains two space-separated integers $n$ ($1 \le n \le 2\cdot10^5$) and $q$ ($1 \le q \le 2\cdot10^5$) — the number of elements in the array and the number of queries, correspondingly.

The next line contains $n$ space-separated integers $a_i$ ($1 \le a_i \le 2\cdot10^5$) — the array elements.

Each of the following $q$ lines contains two space-separated integers $l_i$ and $r_i$ ($1 \le l_i \le r_i \le n$) — the $i$-th query.
#include<bits/stdc++.h>
#include<math.h>
#include<unordered_set>
#define ll long long int
#define pb push_back
#define mp make_pair
#define rep(i,n) for(ll i = 0;i<n;i++)
#define all(v) v.begin(),v.end()
#define disp(v) for(ll vid = 0;vid<v.size();vid++)cout<<v[vid]<<" ";
using namespace std; 

/*
long long primf(long long x, long long n, long long k) {
    x %= k;
    long long res = 1;
    while (n > 0) {
        if (n & 1)
            res = res * x % k;
        x = x * x % k;
        n >>= 1;
    }
    return res;
}
*/
/*
ll primf(ll x, ll n, ll m){
    ll res = 1%m;
    while(n--){
        res*=x;
        res = res%m;
    }
    return res;
}
*/
/*
ll geom(ll r, ll n, ll m){
    if(n==2) return (primf(r,0,m) + primf(r,1,m) + primf(r,2,m))%m;
    else if(n==1) return (primf(r,0,m) + primf(r,1,m))%m;
    else if(n==0) return 1%m; 
    else if(n%2==0) return (((primf(r,n/2+1,m) + 1%m)* geom(r,n/2-1,m))%m + primf(r,n/2,m))%m;
    else{
        return (geom(r,n/2,m) * (primf(r,n/2+1,m) + 1%m))%m;
    }
}
*/

void solve(){
    ll n,q;
    cin>>n>>q;
    ll t;
    vector<ll>v;
    rep(i,n) cin>>t, v.pb(t);
    sort(all(v));
    ll l,r;
    map<ll,ll> mp;
    for(ll i = 0;i<q;i++){
        cin>>l>>r;
        for(ll g=l;g<=r;g++){
            mp[g]++;
        }
    }
    multiset<ll> ms;
    for(auto itr : mp){
        ms.insert(itr.second);
    }
    int it=0;
    ll ans=0;
    for(auto x : ms){
        ans+=(x*v[it]);
        it++;
    }
    cout<<ans<<endl;

}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    // ll tms;
    // cin>>tms;
    // while(tms--){
    //     solve();
    // }
    solve();
return 0;
}

