package main

import (
	"cmp"

	pq "github.com/emirpasic/gods/v2/queues/priorityqueue"
)

type Element struct {
	value int
	index int
}

func byValue(l, r Element) int {
	return cmp.Compare(l.value, r.value)
}

func byReversedValue(l, r Element) int {
	return cmp.Compare(r.value, l.value)
}

func longestSubarray(nums []int, limit int) int {
	maxHeap := pq.NewWith(byReversedValue)
	minHeap := pq.NewWith(byValue)

	longest := 0

	left := 0
	for right := 0; right < len(nums); right++ {
		maxHeap.Enqueue(Element{nums[right], right})
		minHeap.Enqueue(Element{nums[right], right})

		maxElement, _ := maxHeap.Peek()
		minElement, _ := minHeap.Peek()
		for maxElement.value-minElement.value > limit {
			left = 1 + min(maxElement.index, minElement.index)

			for maxElement.index < left {
				maxHeap.Dequeue()
				maxElement, _ = maxHeap.Peek()
			}

			for minElement.index < left {
				minHeap.Dequeue()
				minElement, _ = minHeap.Peek()
			}
		}

		longest = max(longest, right-left+1)
	}

	return longest
}