#include "bits/stdc++.h"
using namespace std;
#define pb          push_back
#define ll          long long
#define mp          make_pair
#define pii         pair<int,int>
#define vi          vector<int>
#define vii         vector<pii>
#define mi          map<int,int>
#define mii         map<pii,int>
#define all(a)      (a).begin(),(a).end()
#define x           first
#define y           second
#define sz(x)       (int)x.size()
#define endl        '\n'
#define MOD         1000000007
#define hell        1000000007
#define N           4000
#define debug(x) cout << '>' << #x << ':' << x << endl;
#define rep(i,a,b)  for(int i=a;i<b;i++)
#define rev(i,a,b)  for(int i=a;i>=b;i--)
#define ll          long long
#define bg(i)       i.begin()
#define fset(it,s)   for(auto it = s.begin(); it != s.end(); it++)
 
 
#define track(x)                cerr<<#x<<": "<<x<<endl
#define track2(x, y)             cerr<<#x<<": "<<x<<" | "<<#y<<": "<<y<<endl
#define track3(x, y, z)          cerr<<#x<<":" <<x<<" | "<<#y<<": "<<y<<" | "<<#z<<": "<<z<<endl
#define track4(a, b, c, d)       cerr<<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<endl
 
#define ed(i)       i.end()
#define mem(a)      memset(a, 0, sizeof(a))
ll mult(ll a,ll b, ll p=MOD){return ((a%p)*(b%p))%p;}
ll add(ll a, ll b, ll p=MOD){return (a%p + b%p)%p;}
ll fpow(ll n, ll k, ll p = MOD) {ll r = 1; for (; k; k >>= 1LL) {if (k & 1LL) r = mult(r,n,p); n = mult(n,n,p);} return r;}
ll inv(ll a, ll p = MOD) {return fpow(a, p - 2, p);}
void self_max(int &a, int &b) {a = max(a, b); }
void self_min(int &a, int &b) {a = min(a, b); }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
const ll sizes  = 1e7+1;
// bool dp[sizes] ;
// std::vector<int> veca;
 
bool isPrime(int n)  
{  
    // Corner cases  
    if (n <= 1)  return false;  
    if (n <= 3)  return true;  
    
    // This is checked so that we can skip   
    // middle five numbers in below loop  
    if (n%2 == 0 || n%3 == 0) return false;  
    
    for (int i=5; i*i<=n; i=i+6)  
        if (n%i == 0 || n%(i+2) == 0)  
           return false;  
    
    return true;  
}
 
/*void SieveOfEratosthenes() 
{ 
    // Create a boolean array "prime[0..n]" and initialize 
    // all entries it as true. A value in prime[i] will 
    // finally be false if i is Not a prime, else true. 
    // bool prime[n+1]; 
    memset(dp, true, sizeof(dp)); 
  
    for (int p=2; p*p<=sizes; p++) 
    { 
        // If prime[p] is not changed, then it is a prime 
        if (dp[p] == true) 
        { 
            // Update all multiples of p greater than or  
            // equal to the square of it 
            // numbers which are multiple of p and are 
            // less than p^2 are already been marked.  
            for (int i=p*p; i<=sizes; i += p) 
                dp[i] = false; 
        } 
    } 
 
    for (int i = 2; i < sizes; ++i)
    {
        if(dp[i]){
            veca.pb(i);
        }
    }
  
    // Print all prime numbers 
     
} */

void solve(){
    ll n , t , p , m , a ,x  , c, y, b ,o ,k ;
    cin >> n >> m;
    std::vector<int> v;
    
    p = n + m;

    p = ((p) * (p - 1) )/2;
    p -= (n * m);

    cout << p << endl;;

}

 
 
int main() {
    ios::sync_with_stdio(false);
    cout<<fixed<<setprecision(12);
    cin.tie(0);
    cout.tie(0);
    // SieveOfEratosthenes();
    // fun();
    int t = 1;
    // cin >> t; 
    // int p = t;  
    while(t--){
        // cout << "Case #" << p - t << ": ";
        solve();
    }
}

Measured memory_bytes: 256