n,c = map(int,input().split())
maxW = 500000
# P = 1
# while maxW > P: P *= 2
# tree = [0]*(2*P)
# def setmax(v, val):
# v += P-1
# tree[v] = val
# v //= 2
# while v > 0:
# tree[v] = max(tree[v],tree[v * 2])
# tree[v] = max(tree[v],tree[v * 2 + 1])
# v //= 2
# def get1max(v):
# return tree[v+P-1]
# def getmax(a, b):
# a += P-1
# b += P-1
# ans = max(tree[a],tree[b])
# while b>a+1:
# #print(a,b,ans)
# if a % 2 == 0:
# ans = max(ans,tree[a + 1])
# if b % 2 == 1:
# ans = max(ans,tree[b - 1])
# a //= 2
# b //= 2
# return ans
M = [0]*(maxW+1)
Maxall = 0
old_a = 0
best = 0
d = {}
for i in range(n):
a,w = map(int,input().split())
if a != old_a:
for k in d:
#setmax(k,d[k])
M[k]=d[k]
d = {}
old_a = a
Maxall = max(Maxall,best)
best = 0
#print("new", tree)
#print(a,w,tree)
if w not in d:
nocost = M[w]+a
withcost = Maxall +a -c
better = max(nocost,withcost)
d[w] = better
best = max(best,better)
# other = 0
# if w>1:
# other = max(other,getmax(1,w-1))
# if w<maxW:
# other = max(other,getmax(w+1,maxW))
# withcost = other + a - c
# d[w] = max(nocost,withcost)
#print(a,w,nocost,other,withcost,d)
else:
for k in d:
#setmax(k,d[k])
M[k]=d[k]
Maxall = max(Maxall,best)
print(Maxall)
#print(tree)
#print(tree[1])
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | n,c = map(int,input().split()) maxW = 500000 # P = 1 # while maxW > P: P *= 2 # tree = [0]*(2*P) # def setmax(v, val): # v += P-1 # tree[v] = val # v //= 2 # while v > 0: # tree[v] = max(tree[v],tree[v * 2]) # tree[v] = max(tree[v],tree[v * 2 + 1]) # v //= 2 # def get1max(v): # return tree[v+P-1] # def getmax(a, b): # a += P-1 # b += P-1 # ans = max(tree[a],tree[b]) # while b>a+1: # #print(a,b,ans) # if a % 2 == 0: # ans = max(ans,tree[a + 1]) # if b % 2 == 1: # ans = max(ans,tree[b - 1]) # a //= 2 # b //= 2 # return ans M = [0]*(maxW+1) Maxall = 0 old_a = 0 best = 0 d = {} for i in range(n): a,w = map(int,input().split()) if a != old_a: for k in d: #setmax(k,d[k]) M[k]=d[k] d = {} old_a = a Maxall = max(Maxall,best) best = 0 #print("new", tree) #print(a,w,tree) if w not in d: nocost = M[w]+a withcost = Maxall +a -c better = max(nocost,withcost) d[w] = better best = max(best,better) # other = 0 # if w>1: # other = max(other,getmax(1,w-1)) # if w<maxW: # other = max(other,getmax(w+1,maxW)) # withcost = other + a - c # d[w] = max(nocost,withcost) #print(a,w,nocost,other,withcost,d) else: for k in d: #setmax(k,d[k]) M[k]=d[k] Maxall = max(Maxall,best) print(Maxall) #print(tree) #print(tree[1]) |
English