#include <bits/stdc++.h>
using namespace std;
complex<double> rotate(complex<double> p, double a) {
  return p * polar(1.0, a);
}
double cross(complex<double> v, complex<double> w) {
  return (conj(v) * w).imag();
}
double ccw(complex<double> a, complex<double> b, complex<double> o) {
  return cross(a - o, b - o);
}
struct Line {
  complex<double> v;
  double c;
  Line(complex<double> p, complex<double> q) : v(q - p), c(cross(v, p)) {}
};
bool lineAndLine(Line l1, Line l2, complex<double> &out) {
  double d = cross(l1.v, l2.v);
  if (d == 0) return false;
  out = (l2.v * l1.c - l1.v * l2.c) / d;
  return true;
}
int countOne(int a) {
  int cnt = 0;
  for (int i = 0; i < 20; i++)
    if (a & (1 << i)) cnt++;
  return cnt;
}
bool myComp(int a, int b) { return countOne(a) < countOne(b); }
double f(complex<double> p, double a, double l) {
  complex<double> q = p + rotate(complex<double>(l, 0) - p, a);
  complex<double> out;
  if (lineAndLine(Line(p, q),
                  Line(complex<double>(l, 0), complex<double>(l + 1, 0)),
                  out)) {
    return (l <= out.real()) ? (out.real() - l) : 1e30;
  } else {
    return 1e30;
  }
}
const int MAXN = 20;
double dp[1 << MAXN], a[MAXN];
complex<double> p[MAXN];
int main() {
  int n;
  double l, r;
  cin >> n >> l >> r;
  for (int i = 0; i < n; i++) {
    double xx, yy;
    cin >> xx >> yy >> a[i];
    p[i] = {xx, yy};
    a[i] = a[i] * 3.14159265358979323846 / 180.0;
  }
  dp[0] = 0.0;
  vector<int> bv;
  for (int i = 1; i < (1 << n); i++) bv.push_back(i);
  sort(bv.begin(), bv.end(), myComp);
  for (auto bm : bv) {
    dp[bm] = 0.0;
    for (int i = 0; i < n; i++)
      if (bm & (1 << i))
        dp[bm] = max(dp[bm],
                     dp[bm ^ (1 << i)] + f(p[i], a[i], dp[bm ^ (1 << i)] + l));
  }
  printf("%.11f\n", min(dp[(1 << n) - 1], r - l));
}
