← Home
package main

import (
	"bufio"
	"os"
	"strconv"
)

func readInt(in *bufio.Reader) int64 {
	var n int64
	var c byte
	for {
		c, _ = in.ReadByte()
		if c >= '0' && c <= '9' {
			break
		}
	}
	for {
		n = n*10 + int64(c-'0')
		c, _ = in.ReadByte()
		if c < '0' || c > '9' {
			break
		}
	}
	return n
}

func main() {
	in := bufio.NewReader(os.Stdin)
	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	n := int(readInt(in))
	q := int(readInt(in))

	K := n
	if K > 15 {
		K = 15
	}

	fact := make([]int64, 16)
	fact[0] = 1
	for i := int64(1); i <= 15; i++ {
		fact[i] = fact[i-1] * i
	}

	getPerm := func(R int64) []int {
		avail := make([]int, K)
		for i := 0; i < K; i++ {
			avail[i] = i + 1
		}
		perm := make([]int, K)
		for i := 0; i < K; i++ {
			f := fact[K-1-i]
			idx := R / f
			R %= f
			perm[i] = avail[idx]
			copy(avail[idx:], avail[idx+1:])
			avail = avail[:len(avail)-1]
		}
		return perm
	}

	var R int64 = 0
	perm := getPerm(R)

	sum := func(idx int) int64 {
		if idx == 0 {
			return 0
		}
		if idx <= n-K {
			return int64(idx) * int64(idx+1) / 2
		}
		S := int64(n-K) * int64(n-K+1) / 2
		count := idx - (n - K)
		for i := 0; i < count; i++ {
			S += int64(n-K) + int64(perm[i])
		}
		return S
	}

	for i := 0; i < q; i++ {
		t := int(readInt(in))
		if t == 1 {
			l := int(readInt(in))
			r := int(readInt(in))
			ans := sum(r) - sum(l-1)
			out.WriteString(strconv.FormatInt(ans, 10))
			out.WriteByte('\n')
		} else {
			x := readInt(in)
			R += x
			perm = getPerm(R)
		}
	}
}