← Home
```go
package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
	"sort"
)

const MaxP int64 = 1000000000
const INF int64 = 1 << 62

type FastScanner struct {
	data []byte
	idx  int
}

func NewFastScanner() *FastScanner {
	b, _ := io.ReadAll(os.Stdin)
	return &FastScanner{data: b}
}

func (fs *FastScanner) NextInt64() int64 {
	n := len(fs.data)
	for fs.idx < n && fs.data[fs.idx] <= ' ' {
		fs.idx++
	}
	sign := int64(1)
	if fs.data[fs.idx] == '-' {
		sign = -1
		fs.idx++
	}
	var v int64
	for fs.idx < n {
		c := fs.data[fs.idx]
		if c < '0' || c > '9' {
			break
		}
		v = v*10 + int64(c-'0')
		fs.idx++
	}
	return sign * v
}

type Task struct {
	id   int
	t    int64
	s    int64
	p    int64
	rank int
}

type PQ struct {
	data  []int
	tasks []Task
}

func (h *PQ) Len() int {
	return len(h.data)
}

func (h *PQ) Push(x int) {
	h.data = append(h.data, x)
	i := len(h.data) - 1
	for i > 0 {
		p := (i - 1) / 2
		if h.tasks[h.data[p]].p >= h.tasks[h.data[i]].p {
			break
		}
		h.data[p], h.data[i] = h.data[i], h.data[p]
		i = p
	}
}

func (h *PQ) Pop() int {
	ret := h.data[0]
	last := h.data[len(h.data)-1]
	h.data = h.data[:len(h.data)-1]
	if len(h.data) > 0 {
		h.data[0] = last
		i := 0
		for {
			l := i*2 + 1
			if l >= len(h.data) {
				break
			}
			r := l + 1
			j := l
			if r < len(h.data) && h.tasks[h.data[r]].p > h.tasks[h.data[l]].p {
				j = r
			}
			if h.tasks[h.data[i]].p >= h.tasks[h.data[j]].p {
				break
			}
			h.data[i], h.data[j] = h.data[j], h.data[i]
			i = j
		}
	}
	return ret
}

func choosePx(k int, d []int64) (int64, bool) {
	m := len(d)
	if m == 0 {
		return 1, true
	}
	if k == 0 {
		if d[0] < MaxP {
			return d[0] + 1, true
		}
		return 0, false
	}
	if k == m {
		if d[m-1] > 1 {
			return 1, true
		}
		return 0, false
	}
	if d[k]+1 < d[k-1] {
		return d[k] + 1, true
	}
	return 0, false
}

func main() {
	fs := NewFastScanner()
	n := int(fs.NextInt64())
	tasks := make([]Task, n)
	x := -1
	known := make([]int, 0, n-1)
	for i := 0; i < n; i++ {
		ti := fs.NextInt64()
		si := fs.NextInt64()
		pi := fs.NextInt64()
		tasks[i] = Task{id: i, t: ti, s: si, p: pi}
		if pi == -1 {
			x = i
			tasks[i].p = 0
		} else {
			known = append(known, i)
		}
	}
	T := fs.NextInt64()

	m := len(known)

	knownByPriority := make([]int, m)
	copy(knownByPriority, known)
	sort.Slice(knownByPriority, func(i, j int) bool {
		return tasks[knownByPriority[i]].p > tasks[knownByPriority[j]].p
	})

	d := make([]int64, m)
	for i, idx := range knownByPriority {
		tasks[idx].rank = i + 1
		d[i] = tasks[idx].p
	}

	knownByArrival := make([]int, m)
	copy(knownByArrival, known)
	sort.Slice(knownByArrival, func(i, j int) bool {
		if tasks[knownByArrival[i]].t == tasks[knownByArrival[j]].t {
			return knownByArrival[i] < knownByArrival[j]
		}
		return tasks[knownByArrival[i]].t < tasks[knownByArrival[j]].t
	})

	tx := tasks[x].t
	sx := tasks[x].s

	cache := make([]int64, m+1)
	done := make([]bool, m+1)

	calc := func(k int) int64 {
		if done[k] {
			return cache[k]
		}
		var w int64
		var cur int64
		rem := sx
		started := false

		for _, idx := range knownByArrival {
			if tasks[idx].rank > k {
				continue
			}
			a := tasks[idx].t
			s := tasks[idx].s

			if !started {
				if a < tx {
					delta := a - cur
					if w > delta {
						w -= delta
					} else {
						w = 0
					}
					w += s
					cur = a
					continue
				}
				delta := tx - cur
				if w > delta {
					w -= delta
				} else {
					w = 0
				}
				cur = tx
				started = true
			}

			delta := a - cur
			if w < delta {
				avail := delta - w
				if rem <= avail {
					cache[k] = cur + w + rem
					done[k] = true
					return cache[k]
				}
				rem -= avail
				w = 0
			} else {
				w -= delta
			}
			cur = a
			w += s
		}

		if !started {
			delta := tx - cur
			if w > delta {
				w -= delta
			} else {
				w = 0
			}
			cur = tx
		}

		cache[k] = cur + w + rem
		done[k] = true
		return cache[k]
	}

	lo, hi := 0, m
	for lo < hi {
		mid := (lo + hi) / 2
		if calc(mid) >= T {
			hi = mid
		} else {
			lo = mid + 1
		}
	}
	L := lo

	lo, hi = L, m
	for lo < hi {
		mid := (lo + hi + 1) / 2
		if calc(mid) <= T {
			lo = mid
		} else {
			hi = mid - 1
		}
	}
	R := lo

	var px int64
	for k := L; k <= R; k++ {
		if p, ok := choosePx(k, d); ok {
			px = p
			break
		}
	}

	tasks[x].p = px

	arr := make([]int, n)
	for i := 0; i < n; i++ {
		arr[i] = i
	}
	sort.Slice(arr, func(i, j int) bool {
		if tasks[arr[i]].t == tasks[arr[j]].t {
			return arr[i] < arr[j]
		}
		return tasks[arr[i]].t < tasks[arr[j]].t
	})

	rem := make([]int64, n)
	comp := make([]int64, n)
	for i := 0; i < n; i++ {
		rem[i] = tasks[i].s
	}

	pq := &PQ{tasks: tasks}
	var t int64
	i := 0

	for i < n || pq.Len() > 0 {
		if pq.Len() == 0 && i < n && t < tasks[arr[i]].t {
			t = tasks[arr[i]].t
		}
		for i < n && tasks[arr[i]].t == t {
			pq.Push(arr[i])
			i++
		}
		if pq.Len() == 0 {
			continue
		}
		idx := pq.Pop()
		next := INF
		if i < n {
			next = tasks[arr[i]].t
		}
		delta := next - t
		if rem[idx] <= delta {
			t += rem[idx]
			comp[idx] = t
		} else {
			rem[idx] -= delta
			t = next
			pq.Push(idx)
		}
	}

	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	fmt.Fprintln(out, px)
	for i := 0; i < n; i++ {
		if i > 0 {
			fmt.Fprint(out, " ")
		}
		fmt.Fprint(out, comp[i])
	}
	fmt.Fprintln(out)
	out.Flush()
}
```