Problem: 2060D - Subtract Min Sort
Language: java

Solution 1 (runtime: 296 ms):
//-------------------------------KING DONT LOOK DOWN---------------------------------------//

import java.io.*;
import java.math.BigInteger;
import java.util.*;
import java.util.List;


import java.awt.*;

public class Main {

  static long sx = 0, sy = 0;
  static int[][] dirs = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
  // static ArrayList<Integer>[] a;
  static ArrayList<Integer>[] g;
  static ArrayList<Integer>[] ra;
  static long[][] dp;
  static long[] fa;
  static int[] farr;
  public static PrintWriter out = new PrintWriter(System.out);
  // static ArrayList<pair> pa = new ArrayList<>();
  static StringBuilder sb = new StringBuilder();
  static boolean cycle = false;
  static long mod = 998244353;
  static long[] no, col;
  static String s;
  // static long k = 0, n = 0, ans = 0;
  static long cnt;
  // static long[] dp;
  // static long[] p;
  // static long[] ans;
  // static Double[][] a = new Double[2][2];
  static Double[] x;
  static Double[] y;
  static long[] d;
  static int[][] par;
  static long[] v;
  static HashMap<Integer, Integer> map;
  // static ArrayList<Integer> p;
  static int time = 0;
  static int[] id;
  static TreeSet<Long> hm;
  // static int[] ans;
  static boolean[] prime;

  static int[] depth;
  static int[] leafs;
  static int[] size;

  static int[] depth1Count;
  static HashSet<Integer> nonLeafPar1;

  static long ans, totalLeafs, depth1;


  public static void main(String[] args) throws IOException {

    // Scanner scn = new Scanner(new BufferedReader(new
    //     InputStreamReader(System.in)));
    Reader scn = new Reader();

    int t = scn.nextInt();
    StringBuilder sb = new StringBuilder();

    z:
    while (t-- > 0) {

      int n = scn.nextInt();

      int[] a = scn.nextIntArray(n);

      for (int i = 1; i < n; i++) {

        if (a[i] >= a[i - 1]) {
          a[i] -= a[i - 1];
        } else {
          sb.append("NO");
          sb.append("\n");
          continue z;
        }

      }

      sb.append("YES");

      sb.append("\n");
    }

    out.println(sb);
    out.flush();


  }

  public static void evaluate(int v, int par) {

    int n = g.length - 1;

    if (g[v].size() == 1) {
      ans += n - totalLeafs;
      return;
    }

    if (par != -1 && depth[par] == 1) {
      ans += (n - size[v] - depth1 - totalLeafs + leafs[v] + depth1Count[v]);
    }

    for (int nbr : g[v]) {
      if (nbr != par) {
        evaluate(nbr, v);

        if (depth[nbr] == 1) {
          ans += size[nbr] - leafs[nbr] - depth1Count[nbr];
        }
      }
    }
  }


  public static void dfs(int v, int par) {

    if (g[v].size() == 1) {
      depth[v] = 0;
      leafs[v] = 1;
      size[v] = 1;
      return;
    }

    int minDepth = Integer.MAX_VALUE;

    for (int nbr : g[v]) {

      if (nbr != par) {
        dfs(nbr, v);
        minDepth = Math.min(minDepth, depth[nbr]);
        leafs[v] += leafs[nbr];
        size[v] += size[nbr];
        depth1Count[v] += depth1Count[nbr];
      }
    }

    size[v]++;
    depth[v] = minDepth + 1;

    if (depth[v] == 1) {
      depth1++;
      depth1Count[v]++;
    }

  }

  // public static long lcm(long x, long y) {
  //
  // return (x * y) / gcd(x, y);
  // }
  //
  // private static long gcd(long x, long y) {
  // if (x == 0)
  // return y;
  //
  // return gcd(y % x, x);
  // }
  //
  // static class comp implements Comparator<pair> {
  //
  //   @Override
  //   public int compare(pair p1, pair p2) {
  //
  //     if (p1.val2 != p2.val2) {
  //       return (int) (p1.val2 - p2.val2);
  //     } else {
  //       return (int) (p1.val1 - p2.val2);
  //     }
  //
  //   }
  // }

  //
  // }
  //
  public static long pow(long a, long b) {

    if (b < 0) {
      return 0;
    }

    if (b == 0 || b == 1) {
      return (long) Math.pow(a, b);
    }

    if (b % 2 == 0) {

      long ret = pow(a, b / 2) % mod;
      return (ret * ret) % mod;

    } else {
      return ((pow(a, b - 1) % mod) * a % mod) % mod;
    }
  }

  private static class pair implements Comparable<pair> {

    int u, v;

    pair(int u, int v) {

      this.u = u;
      this.v = v;
      // this.w = w;

    }

    @Override
    public int compareTo(pair o) {
      return 0;
    }

    // @Override

    // public String toString() {
    //
    //   return val1 + " " + val2;
    // }

    // @Override
    //
    // public int hashCode() {
    // return (int) (a * 17+);
    // }
    //
    // @Override
    //
    // public boolean equals(Object o) {
    //
    // pair p = (pair) o;
    // return this.a == p.a;
    // }
    //
    // @Override
    //
    // public String toString() {
    // return this.a + " ";
    // }

  }

  private static String reverse(String s) {

    return new StringBuilder(s).reverse().toString();
  }

  public static class Reader {

    final private int BUFFER_SIZE = 1 << 16;
    private DataInputStream din;
    private byte[] buffer;
    private int bufferPointer, bytesRead;

    public Reader() {
      din = new DataInputStream(System.in);
      buffer = new byte[BUFFER_SIZE];
      bufferPointer = bytesRead = 0;
    }

    public Reader(String file_name) throws IOException {
      din = new DataInputStream(new FileInputStream(file_name));
      buffer = new byte[BUFFER_SIZE];
      bufferPointer = bytesRead = 0;
    }

    public String readLine() throws IOException {
      byte[] buf = new byte[1000000 + 1]; // line length
      int cnt = 0, c;
      while ((c = read()) != -1) {
        if (c == '\n') {
          break;
        }
        buf[cnt++] = (byte) c;
      }
      return new String(buf, 0, cnt);
    }

    public int nextInt() throws IOException {
      int ret = 0;
      byte c = read();
      while (c <= ' ') {
        c = read();
      }
      boolean neg = (c == '-');
      if (neg) {
        c = read();
      }
      do {
        ret = ret * 10 + c - '0';
      } while ((c = read()) >= '0' && c <= '9');

      if (neg) {
        return -ret;
      }
      return ret;
    }

    public long nextLong() throws IOException {
      long ret = 0;
      byte c = read();
      while (c <= ' ') {
        c = read();
      }
      boolean neg = (c == '-');
      if (neg) {
        c = read();
      }
      do {
        ret = ret * 10 + c - '0';
      } while ((c = read()) >= '0' && c <= '9');
      if (neg) {
        return -ret;
      }
      return ret;
    }

    public double nextDouble() throws IOException {
      double ret = 0, div = 1;
      byte c = read();
      while (c <= ' ') {
        c = read();
      }
      boolean neg = (c == '-');
      if (neg) {
        c = read();
      }

      do {
        ret = ret * 10 + c - '0';
      } while ((c = read()) >= '0' && c <= '9');

      if (c == '.') {
        while ((c = read()) >= '0' && c <= '9') {
          ret += (c - '0') / (div *= 10);
        }
      }

      if (neg) {
        return -ret;
      }
      return ret;
    }

    private void fillBuffer() throws IOException {
      bytesRead = din.read(buffer, bufferPointer = 0, BUFFER_SIZE);
      if (bytesRead == -1) {
        buffer[0] = -1;
      }
    }

    private byte read() throws IOException {
      if (bufferPointer == bytesRead) {
        fillBuffer();
      }
      return buffer[bufferPointer++];
    }

    public void close() throws IOException {
      if (din == null) {
        return;
      }
      din.close();
    }

    public int[] nextIntArray(int n) throws IOException {
      int[] arr = new int[n];
      for (int i = 0; i < n; i++) {
        arr[i] = nextInt();
      }
      return arr;
    }

    public long[] nextLongArray(int n) throws IOException {
      long[] arr = new long[n];
      for (int i = 0; i < n; i++) {
        arr[i] = nextLong();
      }
      return arr;
    }

    public int[][] nextInt2DArray(int m, int n) throws IOException {
      int[][] arr = new int[m][n];
      for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
          arr[i][j] = nextInt();
        }
      }
      return arr;
    }

    public long[][] nextInt2DArrayL(int m, int n) throws IOException {
      long[][] arr = new long[m][n];
      for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
          arr[i][j] = nextInt();
        }
      }
      return arr;
    }
    // kickstart - Solution
    // atcoder - Main
  }

}

Solution 2 (runtime: 343 ms):
import java.io.*;
import java.util.*;
import static java.lang.Math.*;
public class  MyCPTemplate{
    static final int MOD = (int) (1e9 + 7);static final int INF = (int) (1e9) + 10;


    // safe use long
    static void solve() throws IOException{
        int n = fr.nextInt();
        int[] a = new int[n];

        for(int i =0;i<n;i++){
            a[i] = fr.nextInt();
        }


        int i = 0;

        while(i<n-1){
            if(a[i]>a[i+1]){
                out.println("no");
                return;
            }

            else if(a[i]<a[i+1]){
                a[i+1]-=a[i];
                i++;
            }
            else{
                i+=2;
            }
        }

        out.println("yes");
    }


    public static void main(String[] args) throws Exception {
        int t = 1;
        t = fr.nextInt();
        while (t-->0){
            solve();
        }

        out.close();
    }


    //------------------------------------------------------------------------------------------------------------------//
    static void debug(Object... argObjects) throws IOException {out.println(Arrays.deepToString(argObjects));}
    static FastReader fr = new FastReader();
    static FastWriter out = new FastWriter();
    static class Pair<F extends Comparable<F>,S extends Comparable<S>> implements Comparable<Pair<F,S>>{
        public F first;
        public S second;
        public Pair(){}
        public Pair(F k,S v){
            first = k;
            second = v;
        }
        public String toString(){
            return "(" + first + ", " + second + ")";
        }

        @Override
        public int compareTo(Pair<F, S> that) {
            int cmp = this.first.compareTo(that.first);
            if (cmp == 0) {
                return this.second.compareTo(that.second);
            }
            return cmp;
        }
    }
    static class FastReader {

        BufferedReader br;
        StringTokenizer st;

        public FastReader() {
            br = new BufferedReader(new InputStreamReader(System.in),1<<18);
        }

        String next() {
            while (st == null || !st.hasMoreElements()) {
                try {
                    st = new StringTokenizer(br.readLine());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return st.nextToken();
        }

        int nextInt() {
            return Integer.parseInt(next());
        }

        long nextLong() {
            return Long.parseLong(next());
        }

        double nextDouble() {
            return Double.parseDouble(next());
        }

        String nextLine() {
            String str = "";
            try {
                str = br.readLine();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return str;
        }
    }
    static class FastWriter {
        private final BufferedWriter bw;

        public FastWriter() {
            bw = new BufferedWriter(new OutputStreamWriter(System.out), 1 << 18);
        }

        // Print a single value
        public void print(String s) throws IOException {
            bw.write(s);
        }

        public void print(int x) throws IOException {
            bw.write(Integer.toString(x));
        }

        public void print(long x) throws IOException {
            bw.write(Long.toString(x));
        }

        public void print(double x) throws IOException {
            bw.write(Double.toString(x));
        }
        public void print(Object obj) throws IOException{
            bw.write(obj.toString());
        }

        // Print a value with a newline
        public void println(String s) throws IOException {
            bw.write(s);
            bw.newLine();
        }
        public void println() throws IOException {
            bw.newLine();
        }

        public void println(int x) throws IOException {
            bw.write(Integer.toString(x));
            bw.newLine();
        }

        public void println(long x) throws IOException {
            bw.write(Long.toString(x));
            bw.newLine();
        }

        public void println(double x) throws IOException {
            bw.write(Double.toString(x));
            bw.newLine();
        }
        public void println(Object obj) throws IOException {
            bw.write(obj.toString());
            bw.newLine();
        }



        // Print arrays
        public void printArray(int[] arr) throws IOException {
            for (int x : arr) {
                print(x + " ");
            }
            println("");
        }

        public void printArray(int[][] arr) throws IOException{
            for(int[] a: arr){
                for(int i:a){
                    print(i+" ");
                }
                println();
            }
        }


        public void printArray(long[] arr) throws IOException {
            for (long x : arr) {
                print(x + " ");
            }
            println("");
        }

        // Print collections
        public <T> void printCollection(Collection<T> col) throws IOException {
            for (T x : col) {
                print(x.toString() + " ");
            }
            println("");
        }

        // Flush the buffer
        public void flush() throws IOException {
            bw.flush();
        }

        // Close the writer
        public void close() throws IOException {
            bw.close();
        }
    }



    /*
         Random stuff to try when stuck:
            -if it's 2C then it's dp
            -for combo/probability problems, expand the given form we're interested in
            -make everything the same then build an answer (constructive, make everything 0 then do something)
            -something appears in parts of 2 --> model as graph
            -assume a greedy then try to show why it works
            -find way to simplify into one variable if multiple exist
            -treat it like fmc (note any passing thoughts/algo that could be used so you can revisit them)
            -find lower and upper bounds on answer
            -figure out what ur trying to find and isolate it
            -see what observations you have and come up with more continuations
            -work backwards (in constructive, go from the goal to the start)
            -turn into prefix/suffix sum argument (often works if problem revolves around adjacent array elements)
            -instead of solving for answer, try solving for complement (ex, find n-(min) instead of max)
            -draw something
            -simulate a process
            -dont implement something unless if ur fairly confident its correct
            -after 3 bad submissions move on to next problem if applicable
            -do something instead of nothing and stay organized
            -write stuff down
            -check for some values which might be incorrect --> ((long)sqrt(n) does not always give the max number t*t<=n, adjust t).
         Random stuff to check when wa:
            -if code is way too long/cancer then reassess
            -switched N/M
            -int overflow
            -switched variables
            -wrong MOD
            -hardcoded edge case incorrectly
         Random stuff to check when tle:
            -continue instead of break
            -condition in for/while loop bad
         Random stuff to check when rte:
            -switched N/M
            -long to int/int overflow
            -division by 0
            -edge case for empty list/data structure/N=1
      */
}