← Home
package main

import (
	"bufio"
	"os"
)

type FastScanner struct {
	r *bufio.Reader
}

func (fs *FastScanner) NextInt64() int64 {
	var sign int64 = 1
	var val int64
	c, _ := fs.r.ReadByte()
	for (c < '0' || c > '9') && c != '-' {
		c, _ = fs.r.ReadByte()
	}
	if c == '-' {
		sign = -1
		c, _ = fs.r.ReadByte()
	}
	for c >= '0' && c <= '9' {
		val = val*10 + int64(c-'0')
		c2, err := fs.r.ReadByte()
		if err != nil {
			return val * sign
		}
		c = c2
	}
	fs.r.UnreadByte()
	return val * sign
}

func abs(x int64) int64 {
	if x < 0 {
		return -x
	}
	return x
}

func max(a, b int64) int64 {
	if a > b {
		return a
	}
	return b
}

func main() {
	fs := &FastScanner{r: bufio.NewReaderSize(os.Stdin, 1<<20)}
	n := fs.NextInt64()
	m := fs.NextInt64()

	d := fs.NextInt64()
	h := fs.NextInt64()

	firstD, firstH := d, h
	prevD, prevH := d, h
	ans := firstH + firstD - 1
	possible := true

	for i := int64(1); i < m; i++ {
		cd := fs.NextInt64()
		ch := fs.NextInt64()

		dist := cd - prevD
		diff := abs(ch - prevH)
		if diff > dist {
			possible = false
			break
		}
		cur := max(prevH, ch) + (dist-diff)/2
		ans = max(ans, cur)

		prevD, prevH = cd, ch
	}

	if !possible {
		os.Stdout.WriteString("IMPOSSIBLE")
		return
	}

	ans = max(ans, prevH+n-prevD)

	w := bufio.NewWriterSize(os.Stdout, 32)
	defer w.Flush()

	var buf [32]byte
	x := ans
	if x == 0 {
		w.WriteByte('0')
		return
	}
	i := len(buf)
	for x > 0 {
		i--
		buf[i] = byte('0' + x%10)
		x /= 10
	}
	w.Write(buf[i:])

	_ = firstD
	_ = firstH
}