Problem: 2060D - Subtract Min Sort
Language: java

Solution 1 (runtime: 218 ms):
import java.util.*;

import java.io.*;
	
			public class Main {
				

 
			public static void main(String[] args) throws FileNotFoundException,IOException, InterruptedException {
				Scanner s=new Scanner(System.in);
				PrintWriter pw=new PrintWriter(System.out);	
				
				
				int t=s.nextInt();
				while (t-->0)
				{
					int n=s.nextInt();
					int[]a=s.nextIntArr(n);
					boolean ans = true;
					for (int i=0; i<n-1;i++)
					{
						if (a[i] > a[i+1])
						{
							ans=false;
							break;
						}
						else {
							a[i+1]-=a[i];
							a[i]=0;
						}
					}
					for (int i=1; i<n;i++)
						ans&=a[i]>=a[i-1];
					pw.println(ans?"YES":"NO");
					
				}	
				pw.flush();
				
			}
			
			
			// used with hashmap or treemap
			// value should be integer, element type matches key
			static void putOrIncreaseCounter(int element, TreeMap<Integer, Integer> tm)
			{
				if (tm.containsKey(element))
					tm.put(element, tm.get(element)+1);
				else tm.put(element, 1);
			}
			
			
			// used with hashmap or treemap
			// value should be integer, element type matches key
			static void removeOrDecreaseCounter(int element, TreeMap<Integer, Integer> tm)
			{
				if (!tm.containsKey(element))
					return;
				if (tm.get(element)>1)
					tm.put(element, tm.get(element)-1);
				else tm.remove(element);
			}
			
	
			
			 static void shuffle(int []a)
			{	
				for (int i=0; i<a.length;i++)
				{
					int randIndex=(int)(Math.random()*a.length);
					int temp=a[i];
					a[i]=a[randIndex];
					a[randIndex]=temp;
				}
				
			}
			
			 static int gcd(int a, int b) // O(log(min(a,b))
		    {
			      if (b == 0)
			        return a;
			      return gcd(b, a % b); 
			    }
			
			static class Scanner 
			{
				StringTokenizer st;
				BufferedReader br;
		
				public Scanner() {
				br = new BufferedReader(new InputStreamReader(System.in));
				}		
				public Scanner(String s) throws FileNotFoundException
				{
					br =new BufferedReader(new FileReader(s));
				}
		
				public Scanner(InputStream s){	br = new BufferedReader(new InputStreamReader(s));}
		
		
				public String next() throws IOException 
				{
					while (st == null || !st.hasMoreTokens()) 
						st = new StringTokenizer(br.readLine());
					return st.nextToken();
				}
		
				public int nextInt() throws IOException {return Integer.parseInt(next());}
				
				public long nextLong() throws IOException {return Long.parseLong(next());}
		
				public String nextLine() throws IOException {return br.readLine();}
				
				public double nextDouble() throws IOException
				{
					String x = next();
					StringBuilder sb = new StringBuilder("0");
					double res = 0, f = 1;
					boolean dec = false, neg = false;
					int start = 0;
					if(x.charAt(0) == '-')
					{
						neg = true;
						start++;
					}
					for(int i = start; i < x.length(); i++)
						if(x.charAt(i) == '.')
						{
							res = Long.parseLong(sb.toString());
							sb = new StringBuilder("0");
							dec = true;
						}
						else
						{
							sb.append(x.charAt(i));
							if(dec)
								f *= 10;
						}
					res += Long.parseLong(sb.toString()) / f;
					return res * (neg?-1:1);
				}
				 public long[] nextLongArr(int n) throws IOException {
			            long[] arr = new long[n];
			            for (int i = 0; i < n; i++)
			                arr[i] = nextLong();
			            return arr;
			        }
		
			        public int[] nextIntArr(int n) throws IOException {
			            int[] arr = new int[n];
			            for (int i = 0; i < n; i++)
			                arr[i] = nextInt();
			            return arr;
			        }
				
				public boolean ready() throws IOException {return br.ready();}
				
				 
			} //end scanner
			
			
			
		
			
	}
		
	
		 class Pair implements Comparable{
			int x;
			int y;
			Pair(int x, int y)
			{
				this.x=x;
				this.y=y;
			}
			@Override
//			public int compareTo(Object o) {
//				Pair p=(Pair)o;
//				 return  this.x-p.x;
//			}
			public int compareTo(Object o)
			{
				Pair p=(Pair)o;
				return this.x==p.x?this.y-p.y:this.x-p.x;
			}
			public String toString()
			{
				return "("+x+","+y+")";
			}
			
		}
		
		 
		 class Edge implements Comparable<Edge> {
				int node, cost; //node to go to 
			
				Edge(int a, int b) {
					node = a;
					cost = b;
				}
			
				public int compareTo(Edge e) {
					return cost - e.cost;
				}
				public String toString()
				{
					return "{ "+this.node+","+this.cost+" }";
				}
		 
		 	 
		 } 
		 
		 
		

Solution 2 (runtime: 375 ms):
import java.util.*;
import java.io.*;

public class Main {
	static InputStream inputStream;
	static OutputStream outputStream;
	static InputReader in;
	static PrintWriter out;
	static int MULTIPLE_TESTACES = 1;
  
	///////////////////////////////////////
	// solution
	///////////////////////////////////////
	static class Solution {
    
    private boolean pos(ArrayList<Long> o){
			int n = o.size();
			ArrayList<Long> a = new ArrayList<Long>();
			for(Long x: o){
				a.add(x);
			}
			for(int i=0; i<n-1;++i){
				long x = a.get(i);
				long y = a.get(i+1);
				long m = Math.min(x, y);
				a.set(i, x-m);
				a.set(i+1, y-m);
			}
			for(int i=0; i<n-1;++i){
				long x = a.get(i);
				long y = a.get(i+1);
				if(x > y)return false;
			}
			return true;
		}
		
		public void solve(int tc) throws IOException{
			int n = in.nextInt();
			ArrayList<Long> a = new ArrayList<Long>();
			for(int i=0; i<n;++i){
				a.add(in.nextLong());
			}
			boolean ans = false;
			ans |= pos(a);
			out.println(ans ? "YES":"NO");
		}	
	}
	
	
	
	
	
	///////////////////////////////////////
	// template
	///////////////////////////////////////
	public static void main(String[] args) throws IOException{
			inputStream = System.in;
			outputStream = System.out;
			in = new InputReader(inputStream);
			out = new PrintWriter(outputStream);
			int tc = 1;
			if(MULTIPLE_TESTACES>0)tc = in.nextInt();
			Solution sol = new Solution();
			for(int i=1; i<=tc;++i){
				 sol.solve(i);
			}
			in.close();
			out.close();
	}
	
	static class InputReader {
		BufferedReader reader;
		StringTokenizer st;
		public InputReader(InputStream in){
			reader = new BufferedReader(new InputStreamReader(in));
			st = null;
		}
		
		public String next() throws IOException{
			while(st == null || !st.hasMoreTokens()){
				st = new StringTokenizer(reader.readLine());
			}
			return st.nextToken();
		}
		
		public Long nextLong() throws IOException{
			return Long.parseLong(next());
		}
		
		public Integer nextInt() throws IOException{
			return Integer.parseInt(next());
		}
		
		public void close() throws IOException{
			reader.close();
		}
	}
}