Problem p02868 (python)

Fixed submission:
N,M=map(int,input().split())
LRC=sorted([list(map(int,input().split())) for i in range(M)],key=lambda x:x[0])
class rmq:
    def __init__(self,N):
        self.N0=2**(N-1).bit_length()
        self.INF=2**63-1
        self.data=[self.INF]*(2*self.N0)
        self.lazy=[None]*(2*self.N0)
    def gindex(self,l, r):
        L = l + self.N0; R = r + self.N0
        lm = (L // (L & -L)) >> 1
        rm = (R // (R & -R)) >> 1
        while L < R:
            if R <= rm:
                yield R
            if L <= lm:
                yield L
            L >>= 1; R >>= 1
        while L:
            yield L
            L >>= 1
    def propagates(self,*ids):
        for i in reversed(ids):
            v = self.lazy[i-1]
            if v is None:
                continue
            self.lazy[2*i-1] = self.data[2*i-1] = self.lazy[2*i] = self.data[2*i] = v
            self.lazy[i-1] = None
    def update(self,l, r, x):
        *ids, = self.gindex(l, r)
        self.propagates(*ids)
        L = self.N0 + l; R = self.N0 + r
        while L < R:
            if R & 1:
                R -= 1
                self.lazy[R-1] = self.data[R-1] = x
            if L & 1:
                self.lazy[L-1] = self.data[L-1] = x
                L += 1
            L >>= 1; R >>= 1
        for i in ids:
            self.data[i-1] = min(self.data[2*i-1], self.data[2*i])
    def rmin(self,l, r):
        self.propagates(*self.gindex(l, r))
        L = self.N0 + l; R = self.N0 + r
        s = self.INF
        while L < R:
            if R & 1:
                R -= 1
                s = min(s, self.data[R-1])
            if L & 1:
                s = min(s, self.data[L-1])
                L += 1
            L >>= 1; R >>= 1
        return s
d=rmq(N)
d.update(0,1,0)
for l,r,c in LRC:
    d.update(r-1,r,min(d.data[d.N0+r-2],d.rmin(l-1,r-1)+c))
a=d.rmin(N-1,N)
print(a if a<d.INF else -1)

Buggy submission (verdict: Runtime Error):
N,M=map(int,input().split())
LRC=sorted([list(map(int,input().split())) for i in range(M)])
d=[10**15]*N
d[0]=0
import sys
sys.setrecursionlimit(10**6)
class SegTree:
    'min'
    def __init__(self,size,default=10**15):
        self.d=default
        self.N=size
        self.v=[self.d]*(2*self.N-1)
    def update(self,i,x):
        i+=self.N-1
        self.v[i]=x
        while i>0:
            i=(i-1)//2
            self.v[i]=min(self.v[i*2+1],self.v[i*2+2])
    def min(self,a,b,i=0,l=0,r=1e9):
        if r==1e9:
            r=self.N
        if r<=a or b<=l:
            return self.d
        if a<=l and r<=b:
            return self.v[i]
        return min(self.min(a,b,i*2+1,l,(l+r)//2),self.min(a,b,i*2+2,(l+r)//2,r))
s=SegTree(2**14)
s.update(0,0)
for l,r,c in LRC:
    d2=s.min(l-1,r-1)+c
    if d2<d[r-1]:
        d[r-1]=d2
        s.update(r-1,d2)
print(-1 if d[-1]==10**15 else d[-1])

Buggy submission (verdict: Runtime Error):
N,M=map(int,input().split())
LRC=sorted([list(map(int,input().split())) for i in range(M)])
d=[10**15]*N
d[0]=0
class SegTree:
    'min'
    def __init__(self,size,default=10**15):
        self.d=default
        self.N=size
        self.v=[self.d]*(2*self.N-1)
    def update(self,i,x):
        i+=self.N-1
        self.v[i]=x
        while i>0:
            i=(i-1)//2
            self.v[i]=min(self.v[i*2+1],self.v[i*2+2])
    def min(self,a,b,i=0,l=0,r=1e9):
        if r==1e9:
            r=self.N
        if r<=a or b<=l:
            return self.d
        if a<=l and r<=b:
            return self.v[i]
        return min(self.min(a,b,i*2+1,l,(l+r)//2),self.min(a,b,i*2+2,(l+r)//2,r))
s=SegTree(2**14)
s.update(0,0)
for l,r,c in LRC:
    d2=s.min(l-1,r-1)+c
    if d2<d[r-1]:
        d[r-1]=d2
        s.update(r-1,d2)
print(-1 if d[-1]==10**15 else d[-1])