# [Kotlin], 77 bytes

    {it.stream().reduce(1){ r, v->if(r>0&&v<25)1 else(r*if(v<30)2 else 6)%864}<1}

This lambda expression takes a List<Int> and returns true for a heatwave or false else.

Thanks to the magic number 864 and to Udo and Mathis for their ideas.

How does if work? Each sequence of numbers is iterated with a reduce operation starting at the reduce value 1. If a number >= 25 is seen the reduce is multiplied by 2. If a number >= 30 is seen the reduce is multiplied by 2 and by 3 = 6. If a number < 25 is seen the reduce starts again at 1. If the reduce is divisible by 864=2*2*2*2*2*3*3*3 then a heatwave is found, and the result of the modulo operation is 0 which results in a reduce value of 0 and in a return value of true.

[Try it online!][TIO-ji7eujg4]

[Kotlin]: https://kotlinlang.org
[TIO-ji7eujg4]: https://tio.run/##nVbbitswEH3frxBLu9glu@jmS0IaaB8KhUIftj9gWmdj6jiL7Q0sId@eyvKMNE5ZmdYgLEszZ47mZv0@9HXVXI5FzXYrFn2run79tek3MbvfsM@HQ10WDfvILqeqf@j6tiz2UfzQlr9efpaRiE@sXbDj/abaRu2G390d1zKJBSvrrozaD2b1uFY8lnaBpfH7PNXntThfmHm2Lw3bF1UTFe1Tt2Kf2rZ4XT/2bdU8GeunGwbPQG1bGIDXx2L/XJedoVMbmt@3kZPBB9aNzcVbe3K5YDh0tmAhWSW8rMzN0GYospaaMWAMaxy@03Ee5GDkHXY6yAI24iYjrl0b7ErA1ONcyXFPqbANq58ANw36OehLXA9goH0x6irE03BmOLfFS6/4c3IuNWLILGArBXwx4tmB2ILsafCdAh8NenIm3uA3Ky@BH8ZPw@DEV8h7LobKxyMYb/ChlQUdF/cceGBOSHhjDmQwzwP42aivJfhFzsjT@CzBxwnoCc/DYiWEE3yPsY8dfHwzqda@fel3/1KtwALeWrzN3JAA3yg@fYeG5lZNhCvdZTj3lWIHZJqVUbC39FVAM9SywcqmXktBbumrd64aEANxLFZGKhgzMJlysxzApuVCKl7h2VLStbKZTsLBNvcV7mypmSpJwBb4VhM@jovyfCx33FOkMiHD8WwYJ9eB8CyBrEdbNNYu9zBmgviTX3V/4c/uumDo7DT@NB6SdJmcdPmExBn9gTGH@gjaS333dZ0z938l5yNB9nKf70qHfacU@WNpwIAOLAMdWHHiB/RrdpUDS9953AB8xb3vUNblBuER/AtA16Kxszrax975etLZcPZsLiZ93US3X@xdZHXrt7aHlkWdbXesaqaXFXqTmcCwd6cdKMVnRtDOf5v8YRtqwOSk4/6PSTs9X/4A "Kotlin – Try It Online"