```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()
}
```