Problem:
Score : 200 points

Problem Statement

In some village, there are 999 towers that are 1,(1+2),(1+2+3),...,(1+2+3+...+999) meters high from west to east, at intervals of 1 meter.

It had been snowing for a while before it finally stopped. For some two adjacent towers located 1 meter apart, we measured the lengths of the parts of those towers that are not covered with snow, and the results are a meters for the west tower, and b meters for the east tower.

Assuming that the depth of snow cover and the altitude are the same everywhere in the village, find the amount of the snow cover.

Assume also that the depth of the snow cover is always at least 1 meter.

Constraints

1 \leq a < b < 499500(=1+2+3+...+999)

All values in input are integers.

There is no input that contradicts the assumption.

Input

Input is given from Standard Input in the following format:

a b

Output

If the depth of the snow cover is x meters, print x as an integer.

Sample Input 1

8 13

Sample Output 1

2

The heights of the two towers are 10 meters and 15 meters, respectively.
Thus, we can see that the depth of the snow cover is 2 meters.

Sample Input 2

54 65

Sample Output 2

1

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <bits/stdc++.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <tuple>
#define mod 1000000007
#define REP(i, n) for (long long i = 0; i < (n); i++)
#define FOR(i, a, b) for (long long i = (a); i <= (b); i++)
#define FORD(i, a, b) for (long long i = (a); i >= (b); i--)
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define mt make_tuple
#define debug(x) cout << #x << '=' << (x) << endl;
#define debugp(x) cout << #x << "= {" << (x.first) << ", " << (x.second) << "}" << endl;
#define debug2(x, y) cout << "{" << #x << ", " << #y << "} = {" << (x) << ", " << (y) << "}" << endl;
#define debugv(v)         \
    cout << #v << " : ";  \
    for (auto x : v)      \
        cout << x << ' '; \
    cout << endl;
#define all(x) x.begin(), x.end()
inline bool EQ(double a, double b) { return fabs(a - b) < 1e-9; }
const int INF = 1 << 29;
typedef long long ll;
typedef unsigned long long ull;
inline int two(int n) { return 1 << n; }
inline int test(int n, int b) { return (n >> b) & 1; }
inline void set_bit(int &n, int b) { n |= two(b); }
inline void unset_bit(int &n, int b) { n &= ~two(b); }
inline int last_bit(int n) { return n & (-n); }
inline int ones(int n)
{
    int res = 0;
    while (n && ++res)
        n -= n & (-n);
    return res;
}
template <class T>
void chmax(T &a, const T &b) { a = max(a, b); }
template <class T>
void chmin(T &a, const T &b) { a = min(a, b); }

long long int gcd(long long int a, long long int b)
{
    if (b == 0)
        return a;
    return gcd(b, a % b);
}

long long int lcm(long long int a, long long int b)
{
    return (a * b) / gcd(a, b);
}

long long int max(long long int a, long long int b)
{
    if (a > b)
        return a;
    return b;
}

long long int power(long long int x, long long int y)
{
    long long int res = 1;
    while (y > 0)
    {
        if (y & 1)
            res = res * x;
        y = y >> 1;
        x = x * x;
    }
    return res;
}

long long int powermod(long long int x, long long int y)
{
    long long int res = 1;
    x = x % mod;
    while (y > 0)
    {
        if (y & 1)
            res = (res * x) % mod;
        y = y >> 1;
        x = (x * x) % mod;
    }
    return res;
}

long long mulmod(long long a, long long b)
{
    long long res = 0;
    a %= mod;
    while (b)
    {
        if (b & 1)
            res = (res + a) % mod;
        a = (2 * a) % mod;
        b >>= 1;
    }

    return res;
}

bool isPrime(long long int n)
{
    if (n <= 1)
        return false;
    if (n <= 3)
        return true;
    if (n % 2 == 0 || n % 3 == 0)
        return false;
    for (int i = 5; i * i <= n; i += 6)
    {
        if ((n % i == 0) || (n % (i + 2) == 0))
            return false;
    }
    return true;
}

long double dist(long long int x1, long long int y1, long long int x2, long long int y2)
{
    return (long double)sqrt((long double)((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)));
}
long long int squaredist(long long int x1, long long int y1, long long int x2, long long int y2)
{
    return ((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}

long long int nCr(long long int n, long long int r)
{
    if (r == 0)
        return 1;
    return (n * nCr(n - 1, r - 1)) / r;
}

long long int countDivisors(long long int n)
{
    long long int cnt = 0;
    for (int i = 1; i <= sqrt(n); i++)
    {
        if (n % i == 0)
        {
            if (n / i == i)
                cnt++;
            else
                cnt = cnt + 2;
        }
    }
    return cnt;
}

unsigned long long int countDivisibles(unsigned long long int A, unsigned long long int B, unsigned long long int M)
{
    if (A % M == 0)
        return (B / M) - (A / M) + 1;

    return (B / M) - (A / M);
}

long long int xorRange(long long int x, long long int y)
{
    if (x % 2 == 0)
    {
        long long int pattern[] = {y, 1, y + 1, 0};
        return pattern[(int)((y - x) % 4)];
    }
    else
    {
        long long int pattern[] = {x, x ^ y, x - 1, (x - 1) ^ y};
        return pattern[(int)((y - x) % 4)];
    }
}

unsigned long long int maxOrRange(unsigned long long int l, unsigned long long int r)
{
    while (l < r)
        l &= (l + 1);
    return (l & r);
}

long long mul(long long a, long long b)
{
    return (a * b) % mod;
}

long long mul(long a, long long b, long long c)
{
    return mul(mul(a, b), c);
}

long long mul(long long a, long long b, long long c, long long d)
{
    return mul(mul(a, b), mul(c, d));
}

long long add(long long a, long long b)
{
    return (a + b) % mod;
}

long long neg(long long a)
{
    return (mod - (a % mod)) % mod;
}

long long sub(long long a, long long b)
{
    return add(a, neg(b));
}

long long minv(long long a)
{
    int b = mod - 2;
    long long ans = 1;
    while (b)
    {
        if (b % 2)
            ans = mul(ans, a);
        a = mul(a, a);
        b /= 2;
    }
    return ans;
}

long long divi(long long a, long long b)
{
    return mul(a, minv(b));
}

bool sortdesc(const std::tuple<int, int, int> &a, const std::tuple<int, int, int> &b)
{
    return (std::get<0>(a) > std::get<0>(b));
}

std::vector<long long> fni(100000);
std::vector<long long> nni(100000);
std::vector<long long> fact(100000);

void Inv_Num_Fact_Factorial(long long p, long long N)
{
    fni[0] = fni[1] = nni[0] = nni[1] = fact[0] = 1;
    for (int i = 1; i <= N; i++)
    {
        if (i >= 2)
        {
            nni[i] = mul(nni[p % i], (p - p / i));
            fni[i] = mul(nni[i], fni[i - 1]);
        }
        fact[i] = mul(fact[i - 1], i);
    }
}

long long fnCr(long long int N, long long int R)
{
    return mul(fact[N], fni[R], fni[N - R]);
}

bool findParity(int x)
{
    int y = x ^ (x >> 1);
    y = y ^ (y >> 2);
    y = y ^ (y >> 4);
    y = y ^ (y >> 8);
    y = y ^ (y >> 16);
    if (y & 1) return 1;
    return 0;
}

using namespace std;

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    vector<int> v;
    int sum = 0;
    for(int i=1;i<1000;i++){
        sum += i;
        v.pb(sum);
    }
    int a,b;
    cin >> a >> b;
    // vector<int>::iterator upper,upper2; 
    // upper = upper_bound (v.begin(), v.end(), a);
    // upper2 = upper_bound (v.begin(), v.end(), b);
    // int x = (upper - v.begin());
    // int y = (upper2- v.begin());
    // cout << v[x]-a;
    for(int i=0;i<998;i++){
        if(v[i]-a==v[i+1]-b){
            cout << v[i]-a;
            break;
        }
    }

}