Problem p02983 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <algorithm>
#include <cstdio>
#include <functional>
#include <iostream>
#include <limits>
#include <map>
#include <math.h>
#include <numeric>
#include <queue>
#include <string>
#include <type_traits>
#include <vector>

using namespace std;

#define INF (1ll << 60)
#define INFint (1 << 30)
#define MOD 1000000007
#define BOUND 27182818284

typedef long long ll;
typedef long long int lli;
// typedef pair<ll,ll> P;

#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define repi(i, a, b) for (int i = int(a); i < int(b); ++i)

template <class T> bool umax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}

template <class T> bool umin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return true;
  }
  return false;
}

// gcd
template <typename T> T gcd(T a, T b) {
  if (a == 0)
    return b;
  return gcd(b % a, a);
}

int findGCD(int arr[], int n) {
  int result = arr[0];
  for (int i = 1; i < n; i++)
    result = gcd(arr[i], result);
  return result;
}

template <typename T> T lcm(T m, T n) {
  // 引数に0がある場合は0を返す
  if ((0 == m) || (0 == n))
    return 0;
  return ((m / gcd(m, n)) * n); // lcm = m * n / gcd(m,n)
}

template <typename A, size_t N, typename T>
void Fill(A (&array)[N], const T &val) {
  fill((T *)array, (T *)(array + N), val);
}

int dx[5] = {1, 0, -1, 0};
int dy[5] = {0, 1, 0, -1};

// v.front() = -BOUND;
// v.back() = BOUND;

// struct edge{
//     int cost, to;
//
//     edge(int in_cost, int in_to){
//         cost=in_cost;
//         to=in_to;
//     }
//     bool operator<(const edge &a) const
//     {
//         return cost > a.cost;
//     }
// };
vector<int> G[10010];
vector<int> c(10010, 0);
int num[10010];
bool used[10010];
int now_c = 0;
int dfs(int s) {
  if (used[s]) {
    return 0;
  } else {
    used[s] = true;
  }

  num[s] = c[now_c];
  now_c++;

  for (int i = 0; i < G[s].size(); i++) {
    dfs(G[s][i]);
  }
  return 0;
}

int main() {
  lli L, R;
  cin >> L >> R;

  if (L - R + 1LL < 2019) {
    lli ans = 2019;
    for (lli i = L; i < R; i++) {
      for (lli j = i + 1; j <= R; j++) {
        ans = min(i * j % 2019, ans);
      }
    }
    cout << ans << endl;

  } else {
    cout << 0 << endl;
  }
  return 0;
}

Fixed submission:
#include <algorithm>
#include <cstdio>
#include <functional>
#include <iostream>
#include <limits>
#include <map>
#include <math.h>
#include <numeric>
#include <queue>
#include <string>
#include <type_traits>
#include <vector>

using namespace std;

#define INF (1ll << 60)
#define INFint (1 << 30)
#define MOD 1000000007
#define BOUND 27182818284

typedef long long ll;
typedef long long int lli;
// typedef pair<ll,ll> P;

#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define repi(i, a, b) for (int i = int(a); i < int(b); ++i)

template <class T> bool umax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}

template <class T> bool umin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return true;
  }
  return false;
}

// gcd
template <typename T> T gcd(T a, T b) {
  if (a == 0)
    return b;
  return gcd(b % a, a);
}

int findGCD(int arr[], int n) {
  int result = arr[0];
  for (int i = 1; i < n; i++)
    result = gcd(arr[i], result);
  return result;
}

template <typename T> T lcm(T m, T n) {
  // 引数に0がある場合は0を返す
  if ((0 == m) || (0 == n))
    return 0;
  return ((m / gcd(m, n)) * n); // lcm = m * n / gcd(m,n)
}

template <typename A, size_t N, typename T>
void Fill(A (&array)[N], const T &val) {
  fill((T *)array, (T *)(array + N), val);
}

int dx[5] = {1, 0, -1, 0};
int dy[5] = {0, 1, 0, -1};

// v.front() = -BOUND;
// v.back() = BOUND;

// struct edge{
//     int cost, to;
//
//     edge(int in_cost, int in_to){
//         cost=in_cost;
//         to=in_to;
//     }
//     bool operator<(const edge &a) const
//     {
//         return cost > a.cost;
//     }
// };
vector<int> G[10010];
vector<int> c(10010, 0);
int num[10010];
bool used[10010];
int now_c = 0;
int dfs(int s) {
  if (used[s]) {
    return 0;
  } else {
    used[s] = true;
  }

  num[s] = c[now_c];
  now_c++;

  for (int i = 0; i < G[s].size(); i++) {
    dfs(G[s][i]);
  }
  return 0;
}

int main() {
  lli L, R;
  cin >> L >> R;

  if (R - L + 1LL < 2019) {
    lli ans = 2019;
    for (lli i = L; i < R; i++) {
      for (lli j = i + 1; j <= R; j++) {
        ans = min(i * j % 2019, ans);
      }
    }
    cout << ans << endl;

  } else {
    cout << 0 << endl;
  }
  return 0;
}