完整版线段树求最小值,支持区间减

来源:互联网 发布:java培训大纲 编辑:程序博客网 时间:2024/05/02 12:51
def Min(a,b):
    if a<b:
        return a
    else:
        return b
class node:
    def __init__(self,x,y):
        self.l=x
        self.r=y
        self.key=0
        self.lazy=0
        if x<y:
            mid=(x+y)/2
            self.left=node(x,mid)
            self.right=node(mid+1,y)
    def Set(p,x,y):
        if p.l==p.r:
            p.key=y
            return
        mid=(p.l+p.r)/2
        if x<=mid:
            p.left.Set(x,y)
        else:
            p.right.Set(x,y)
        p.key=Min(p.left.key,p.right.key)
    def calc(p,x,y):
        if p.l==x and p.r==y:
            return p.key-p.lazy
        if p.lazy!=0:
            p.key=p.key-p.lazy
            p.left.lazy=p.left.lazy+p.lazy
            p.right.lazy=p.right.lazy+p.lazy
            p.lazy=0
        mid=(p.l+p.r)/2
        if mid>=y:
            return p.left.calc(x,y)
        elif mid<x:
            return p.right.calc(x,y)
        else:
            return Min(p.left.calc(x,mid),p.right.calc(mid+1,y))
        p.key=Min(p.left.key-p.left.lazy,p.right.key-p.right.lazy)
    def change(p,x,y,z):
        if p.l==x and p.r==y:
            p.lazy=p.lazy+z
            return
        if p.lazy!=0:
            p.key=p.key-p.lazy
            p.left.lazy=p.left.lazy+p.lazy
            p.right.lazy=p.right.lazy+p.lazy
            p.lazy=0
        mid=(p.l+p.r)/2
        if mid>=y:
            p.left.change(x,y,z)
        elif mid<x:
            return p.right.change(x,y,z)
        else:
            p.left.change(x,mid,z)
            p.right.change(mid+1,y,z)
        p.key=Min(p.left.key-p.left.lazy,p.right.key-p.right.lazy)
A=[]
N=int(input("N:"))
Q=int(input("Q:"))
Tree=node(1,N)
for i in range(0,N):
    x=int(input("A"+str(i)+":"))
    A.append(x)
    Tree.Set(i+1,x)
for i in range(0,Q):
    x=raw_input("code"+str(i)+":")
    if x=="Q":
        X=int(input("X:"))
        Y=int(input("Y:"))
        print Tree.calc(X,Y)
    else :
        X=int(input("X:"))
        Y=int(input("Y:"))
        Z=int(input("Z:"))
        Tree.change(X,Y,Z)