// 0 = Sonntag, 1 = Montag, ... 6 = Samstag
int weekday(int y, int m, int d)
{
    if (m < 3) {
        m += 12;
        y -= 1;
    }
    int K = y % 100;
    int J = y / 100;
    int w = (d + (13*(m + 1))/5 + K + K/4 + J/4 + 5*J) % 7;
    return (w + 6) % 7; // umwandeln zu 0=Sonntag
}

int last_sunday_of_month(int year, int month)
{
    static const int mdays[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
    int days = mdays[month-1];

    // Schaltjahr berücksichtigen
    if (month == 2 && ((year%4==0 && year%100!=0) || (year%400==0)))
        days = 29;

    // Wochentag des letzten Tages
    int w = weekday(year, month, days);

    // Wenn letzter Tag Sonntag ist → days
    return days - w;
}

int is_dst_europe(int year, int month, int day, int hour)
{
    int start = last_sunday_of_month(year, 3);   // letzter Sonntag im März
    int end   = last_sunday_of_month(year, 10);  // letzter Sonntag im Oktober

    // Vor März → Winterzeit
    if (month < 3) return 0;
    // Nach Oktober → Winterzeit
    if (month > 10) return 0;

    // April bis September → immer Sommerzeit
    if (month > 3 && month < 10) return 1;

    // März: Wechsel um 02:00
    if (month == 3) {
        if (day < start) return 0;
        if (day > start) return 1;
        return (hour >= 2);
    }

    // Oktober: Wechsel um 03:00
    if (month == 10) {
        if (day < end) return 1;
        if (day > end) return 0;
        return (hour < 3);
    }

    return 0;
}
