n=int(input())
a,b=map(int,input().split())
d=list(map(int,input().split()))

def D(a,b):
    return abs(a)+abs(b)

MN=[d[0]]
MX=[d[0]]

for i in range(1,n-1):
    if(MX[-1]-d[i]>=0 and MN[-1]-d[i]<=0):
        MN.append(0)
    elif(MX[-1]-d[i]<=0):
        MN.append(abs(MX[-1]-d[i]))
    else:
        MN.append(abs(MN[-1]-d[i]))
    MX.append(MX[-1]+d[i])

mx=MX[-1]
mn=MN[-1]

if D(a,b)%2!=mx%2:
    print("NO")
    exit(0)

if D(a,b)>mx or D(a,b)<mn:
    print("NO")
    exit(0)




pos=[None]*n
pos[0]=(0,0)
pos[-1]=(a,b)

def sheb(x,y):
    return max(abs(x),abs(y))
def intersect(d1,d2,pos):
    # find a point d1 from (0,0) and d2 from pos
    x,y = pos
    x,y = (x+y),(x-y)
    for dx in [-d1,d1,d2+x,x-d2]:
        for dy in [-d1,d1,d2+y,y-d2]:
            if sheb(dx,dy)==d1 and sheb(x-dx,y-dy)==d2:
                return (dx+dy)//2, (dx-dy)//2


def solve(mx,mn,d,pos):
    if (p:=intersect(mx,d,pos)):
        return p
    if mn>0 and (p:=intersect(mn,d,pos)):
        return p
    return (pos[0]+d,pos[1])

for i in range(n-2,0,-1):
    pos[i]=solve(MX[i-1],MN[i-1],d[i],pos[i+1])

print("YES")
for x,y in pos:
    print(x,y)


# print(MX,MN,pos)

# for i in range(n-1):
    # assert(D(pos[i][0]-pos[i+1][0],pos[i][1]-pos[i+1][1])==d[i])