Problem: Carl is a beginner magician. He has a blue, b violet and c orange magic spheres. In one move he can transform two spheres of the same color into one sphere of any other color. To make a spell that has never been seen before, he needs at least x blue, y violet and z orange spheres. Can he get them (possible, in multiple actions)?

Input

The first line of the input contains three integers a, b and c (0 ≤ a, b, c ≤ 1 000 000) — the number of blue, violet and orange spheres that are in the magician's disposal.

The second line of the input contains three integers, x, y and z (0 ≤ x, y, z ≤ 1 000 000) — the number of blue, violet and orange spheres that he needs to get.

Output

If the wizard is able to obtain the required numbers of spheres, print "Yes". Otherwise, print "No".

Examples

Input

4 4 0
2 1 2


Output

Yes


Input

5 6 1
2 7 2


Output

No


Input

3 3 3
2 2 2


Output

Yes

Note

In the first sample the wizard has 4 blue and 4 violet spheres. In his first action he can turn two blue spheres into one violet one. After that he will have 2 blue and 5 violet spheres. Then he turns 4 violet spheres into 2 orange spheres and he ends up with 2 blue, 1 violet and 2 orange spheres, which is exactly what he needs.

Solution (in JAVA):

Solution:
import java.io.*;
import java.util.Arrays;
import java.util.Random;

/**
 * @author Ivan Pryvalov (ivan.pryvalov@gmail.com)
 *
 */
public class CF335D2ProblemA implements Runnable{

    private void solve() throws IOException {
        int[] a = scanner.loadIntArray(3);
        int[] z = scanner.loadIntArray(3);

        int aSum = Arrays.stream(a).sum();
        int zSum = Arrays.stream(z).sum();

        if (zSum > aSum){
            out.println("NO");
            return;
        }


        int[] r = z.clone();


        for(int j=0; j<aSum-zSum; j++){ // steps
            int extra = 0;
            for (int i = 0; i < 3; i++) {
                if (a[i] < r[i]){
                    r[i]--;
                    extra+=2;
                    break;
                }
            }

            if (extra > 0){
                int bestDiff = a[0] - r[0];
                int iBestDiff = 0;
                for (int i = 0; i < 3; i++) {
                    int curDiff = a[i] - r[i];
                    if (curDiff>bestDiff){
                        bestDiff = curDiff;
                        iBestDiff = i;
                    }
                }
                r[iBestDiff] += extra;
                extra = 0;
            }else{
                int rMax = 0;
                int irMax = -1;
                for (int i = 0; i < 3; i++) {//maximize by r[i]
                    if (a[i] != r[i]){
                        if (irMax == -1 || r[i] > rMax){
                            rMax = r[i];
                            irMax = i;
                        }
                    }
                }
                if (irMax>=0){
                    r[irMax]--;
                    extra+=2;
                }
                if (extra>0){
                    //find best place with min R
                    int rMin = 0;
                    int irMin = -1;
                    for (int i = 0; i < 3; i++) {
                        if (a[i]!=r[i]){
                            if (irMin==-1 || r[i] < rMin){
                                rMin = r[i];
                                irMin = i;
                            }
                        }
                    }
                    if (irMin >=0) {
                        r[irMin] += extra;
                        extra = 0;
                    }
                }
            }
        }

        boolean possible = true;
        for (int i = 0; i < 3; i++) {
            if (r[i]!=a[i]){
                possible = false;
                break;
            }
        }

        out.println(possible ? "YES" : "NO");
    }


    /////////////////////////////////////////////////
    final int BUF_SIZE = 1024 * 1024 * 8;//important to read long-string tokens properly
    final int INPUT_BUFFER_SIZE = 1024 * 1024 * 8 ;
    final int BUF_SIZE_INPUT = 1024;

    final int BUF_SIZE_OUT = 1024;

    boolean inputFromFile = false;
    String filenamePrefix = "A-small-attempt0";
    String inSuffix = ".in";
    String outSuffix = ".out";

    //InputStream bis;
    //OutputStream bos;
    PrintStream out;
    ByteScanner scanner;
    ByteWriter writer;

    //	@Override
    public void run() {
        try{
            InputStream bis = null;
            OutputStream bos = null;
            //PrintStream out = null;
            if (inputFromFile){
                File baseFile = new File(getClass().getResource("/").getFile());
                bis = new BufferedInputStream(
                        new FileInputStream(new File(
                                baseFile, filenamePrefix+inSuffix)),
                        INPUT_BUFFER_SIZE);
                bos = new BufferedOutputStream(
                        new FileOutputStream(
                                new File(baseFile, filenamePrefix+outSuffix)));
                out = new PrintStream(bos);
            }else{
                bis = new BufferedInputStream(System.in, INPUT_BUFFER_SIZE);
                bos = new BufferedOutputStream(System.out);
                out = new PrintStream(bos);
            }
            scanner = new ByteScanner(bis, BUF_SIZE_INPUT, BUF_SIZE);
            writer = new ByteWriter(bos, BUF_SIZE_OUT);

            solve();
            out.flush();
        }catch (Exception e) {
            e.printStackTrace();
            System.exit(1);
        }
    }

    public interface Constants{
        final static byte ZERO = '0';//48 or 0x30
        final static byte NINE = '9';
        final static byte SPACEBAR = ' '; //32 or 0x20
        final static byte MINUS = '-'; //45 or 0x2d

        final static char FLOAT_POINT = '.';
    }

    public static class EofException extends IOException{
    }

    public static class ByteWriter implements Constants {

        int bufSize = 1024;
        byte[] byteBuf = new byte[bufSize];
        OutputStream os;

        public ByteWriter(OutputStream os, int bufSize){
            this.os = os;
            this.bufSize = bufSize;
        }

        public void writeInt(int num) throws IOException{
            int byteWriteOffset = byteBuf.length;
            if (num==0){
                byteBuf[--byteWriteOffset] = ZERO;
            }else{
                int numAbs = Math.abs(num);
                while (numAbs>0){
                    byteBuf[--byteWriteOffset] = (byte)((numAbs % 10) + ZERO);
                    numAbs /= 10;
                }
                if (num<0)
                    byteBuf[--byteWriteOffset] = MINUS;
            }
            os.write(byteBuf, byteWriteOffset, byteBuf.length - byteWriteOffset);
        }

        /**
         * Please ensure ar.length <= byteBuf.length!
         *
         * @param ar
         * @throws IOException
         */
        public void writeByteAr(byte[] ar) throws IOException{
            for (int i = 0; i < ar.length; i++) {
                byteBuf[i] = ar[i];
            }
            os.write(byteBuf,0,ar.length);
        }

        public void writeSpaceBar() throws IOException{
            byteBuf[0] = SPACEBAR;
            os.write(byteBuf,0,1);
        }

    }

    public static class ByteScanner implements Constants{

        InputStream is;

        public ByteScanner(InputStream is, int bufSizeInput, int bufSize){
            this.is = is;
            this.bufSizeInput = bufSizeInput;
            this.bufSize = bufSize;

            byteBufInput = new byte[this.bufSizeInput];
            byteBuf = new byte[this.bufSize];
        }

        public ByteScanner(byte[] data){
            byteBufInput = data;
            bufSizeInput = data.length;
            bufSize = data.length;
            byteBuf = new byte[bufSize];
            byteRead = data.length;
            bytePos = 0;
        }

        private int bufSizeInput;
        private int bufSize;

        byte[] byteBufInput;
        byte by=-1;
        int byteRead=-1;
        int bytePos=-1;

        byte[] byteBuf;
        int totalBytes;

        boolean eofMet = false;

        private byte nextByte() throws IOException{

            if (bytePos<0 || bytePos>=byteRead){
                byteRead = is==null? -1: is.read(byteBufInput);
                bytePos=0;
                if (byteRead<0){
                    byteBufInput[bytePos]=-1;//!!!
                    if (eofMet)
                        throw new EofException();
                    eofMet = true;
                }
            }
            return byteBufInput[bytePos++];
        }

        /**
         * Returns next meaningful character as a byte.<br>
         *
         * @return
         * @throws IOException
         */
        public byte nextChar() throws IOException{
            while ((by=nextByte())<=0x20);
            return by;
        }

        /**
         * Returns next meaningful character OR space as a byte.<br>
         *
         * @return
         * @throws IOException
         */
        public byte nextCharOrSpacebar() throws IOException{
            while ((by=nextByte())<0x20);
            return by;
        }

        /**
         * Reads line.
         *
         * @return
         * @throws IOException
         */
        public String nextLine() throws IOException {
            readToken((byte)0x20);
            return new String(byteBuf,0,totalBytes);
        }

        public byte[] nextLineAsArray() throws IOException {
            readToken((byte)0x20);
            byte[] out = new byte[totalBytes];
            System.arraycopy(byteBuf, 0, out, 0, totalBytes);
            return out;
        }


        /**
         * Reads token. Spacebar is separator char.
         *
         * @return
         * @throws IOException
         */
        public String nextToken() throws IOException {
            readToken((byte)0x21);
            return new String(byteBuf,0,totalBytes);
        }

        /**
         * Spacebar is included as separator char
         *
         * @throws IOException
         */
        private void readToken() throws IOException {
            readToken((byte)0x21);
        }

        private void readToken(byte acceptFrom) throws IOException {
            totalBytes = 0;
            while ((by=nextByte())<acceptFrom);
            byteBuf[totalBytes++] = by;
            while ((by=nextByte())>=acceptFrom){
                byteBuf[totalBytes++] = by;
            }
        }

        public int nextInt() throws IOException{
            readToken();
            int num=0, i=0;
            boolean sign=false;
            if (byteBuf[i]==MINUS){
                sign = true;
                i++;
            }
            for (; i<totalBytes; i++){
                num*=10;
                num+=byteBuf[i]-ZERO;
            }
            return sign?-num:num;
        }

        public long nextLong() throws IOException{
            readToken();
            long num=0;
            int i=0;
            boolean sign=false;
            if (byteBuf[i]==MINUS){
                sign = true;
                i++;
            }
            for (; i<totalBytes; i++){
                num*=10;
                num+=byteBuf[i]-ZERO;
            }
            return sign?-num:num;
        }

		/*
		//TODO test Unix/Windows formats
		public void toNextLine() throws IOException{
			while ((ch=nextChar())!='\n');
		}
		*/

        public double nextDouble() throws IOException{
            readToken();
            char[] token = new char[totalBytes];
            for (int i = 0; i < totalBytes; i++) {
                token[i] = (char)byteBuf[i];
            }
            return Double.parseDouble(new String(token));
        }

        public int[] loadIntArray(int size) throws IOException{
            int[] a = new int[size];
            for (int i = 0; i < a.length; i++) {
                a[i] = nextInt();
            }
            return a;
        }

        public long[] loadLongArray(int size) throws IOException{
            long[] a = new long[size];
            for (int i = 0; i < a.length; i++) {
                a[i] = nextLong();
            }
            return a;
        }

    }

    public static abstract class Timing{
        private static int counter = 0;
        protected String name = "Timing"+(++counter);
        private boolean debug;

        public Timing(boolean debug) {
            super();
            this.debug = debug;
        }

        public abstract void run();
        public void start(){
            long time1 = System.currentTimeMillis();
            run();
            long time2 = System.currentTimeMillis();
            if (debug)
                System.out.println(name+" time = "+(time2-time1)/1000.0+" ms.");
        }

    }

    public static class Alg{
        public static interface BooleanChecker{
            public boolean check(long arg);
        }

        public static class BinarySearch{

            /**
             * This check returns boolean value, result of function.
             * It should be monotonic.
             */
            public BooleanChecker bc;


            /**
             * Returns the following 2 elements: <pre> 0 0 [0] [1] 1 1 </pre> <br/>
             * See a comment by "cerealguy" on 10.06.2013 (http://codeforces.ru/blog/entry/7919#comment-136245). <br/>
             */
            public long[] search(long left, long right){
                while (right-left > 1){
                    long mid = (left+right)/2;
                    if (bc.check(mid)){
                        right = mid;
                    }else{
                        left = mid;
                    }
                }
                return new long[]{left,right};
            }

            /**
             * Optional. Returns the following 2 elements: <pre> 1 1 [1] [0] 0 0</pre>. </br>
             *
             * @see BinarySearch#search(long, long)
             */
            public long[] searchInverted(long left, long right){
                while (right-left > 1){
                    long mid = (left+right)/2;
                    if (!bc.check(mid)){
                        right = mid;
                    }else{
                        left = mid;
                    }
                }
                return new long[]{left,right};
            }
        }
    }

    public static class Modulo{
        long mod = (long)1e9+7;

        public Modulo(long mod) {
            super();
            this.mod = mod;
        }

        public long inv(long a) {
            long res =  pow(a, mod-2);
            return res;
        }

        public long pow(long a, long x) {
            if (x==0)
                return 1;
            long part = 1;
            if ((x&1)!=0)
                part = a;
            return (part * pow((a*a)%mod, x>>1)) % mod;
        }

        public long c(long n, long m){
            long res = 1;
            for(int i=1; i<=m; i++){
                res = (res * (n-m+i)) % mod;
                res = (res * inv(i)) % mod;
            }
            return res;
        }

    }


    /**
     * Added 26.04.2013.
     * See KROK 2013, Round 1, Problem D.
     */
    static class DisjointUnionSet implements Cloneable{

        int[] rank;
        int[] parent;

        protected DisjointUnionSet clone(){
            DisjointUnionSet cloned = new DisjointUnionSet(parent.length);
            for(int i=0; i<parent.length; i++){
                cloned.parent[i] = parent[i];
                cloned.rank[i] = rank[i];
            }
            return cloned;
        }

        public DisjointUnionSet(int n) {
            rank = new int[n];
            parent = new int[n];

            for (int i = 0; i < n; i++) {
                parent[i] = i;
            }
        }

        @Override
        public String toString() {
            return "disj [parents=" + Arrays.toString(parent) + "]";
        }

        /**
         * Problem specific or general?
         * O(N * alpha)
         *
         * @param set2
         */
        public void union(DisjointUnionSet set2){
            for(int i=0; i<parent.length; i++){
                parent[find(i)] = parent[find(set2.find(i))];
            }
        }


        /**
         * @param index1 range 0..n-1
         * @param index2
         */
        public void union(int index1, int index2){
            int p1 = find(index1);
            int p2 = find(index2);

            if (rank[p1] > rank[p2]){
                parent[p2] = p1;
            }else if (rank[p2] > rank[p1]){
                parent[p1] = p2;
            }else{
                parent[p2] = p1;
                rank[p1]++;
            }
        }

        /**
         *  O(alpha(n))
         *
         * @param index
         * @return
         */
        private int find(int index) {
            if (parent[index] != index)
                parent[index] =  find(parent[index]);
            return parent[index];
        }

        /**
         * O(N alpha(N)) ==> see find()
         *
         * @return
         */
        public int getCountDisjointSets(){
            int[] used = new int[parent.length];
            for(int i=0; i<parent.length; i++){
                used[find(i)] = 1;
            }
            int res = 0;
            for(int i=0; i<parent.length; i++){
                res += used[i];
            }
            return res;
        }
    }

    private static Random rnd = new Random();
    public static class ArrayUtils{
        public static void shuffle(int[] a){
            for(int j=a.length-1; j>=1; j--){
                int i = rnd.nextInt(j+1);
                swap(a, i, j);
            }
        }

        public static void swap(int[] a, int i, int j){
            int tmp = a[i];
            a[i] = a[j];
            a[j] = tmp;
        }
    }

    public static void main(String[] args) {
        new CF335D2ProblemA().run();
    }

}