Problem:
Score : 200 points

Problem Statement

We have A cards, each of which has an integer 1 written on it. Similarly, we also have B cards with 0s and C cards with -1s.

We will pick up K among these cards. What is the maximum possible sum of the numbers written on the cards chosen?

Constraints

All values in input are integers.

0 \leq A, B, C

1 \leq K \leq A + B + C \leq 2 \times 10^9

Input

Input is given from Standard Input in the following format:

A B C K

Output

Print the maximum possible sum of the numbers written on the cards chosen.

Sample Input 1

2 1 1 3

Sample Output 1

2

Consider picking up two cards with 1s and one card with a 0.
In this case, the sum of the numbers written on the cards is 2, which is the maximum possible value.

Sample Input 2

1 2 3 4

Sample Output 2

0

Sample Input 3

2000000000 0 0 2000000000

Sample Output 3

2000000000

Solution in C# (.NET Core 3.1.201) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AtCoder_Beginner_Contest_167
{
    class B
    {
        static void Main(string[] args)
        {
			var abck = ReadIntArray(4);
			var a = abck[0];
			var b = abck[1];
			var c = abck[2];
			var k = abck[3];

			var aCount = Math.Min(a, k);
			var max = aCount;
			k -= aCount;
			var bCount = Math.Min(b, k);
			k -= bCount;
			Console.WriteLine(max - k);

#if HELLO
			Console.ReadKey();
#endif
		}

		private static List<int> ReadIntListFrom_StringSplit(string s)
		{
			return
				s.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries)
				.Select(int.Parse)
				.ToList();
		}

		///////////////

		private static int[] ReadIntArray() => ReadIntArrayFrom_StringSplit(Console.ReadLine());

		private static int[] ReadIntArray(int size) => ReadIntArrayFrom_FixedSize(Console.ReadLine(), size);

		private static int[] ReadIntArrayFrom_StringSplit(string s) =>
				s.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries)
				.Select(int.Parse)
				.ToArray();


		private static int[] ReadIntArrayFrom_FixedSize(string s, int size)
		{
			var sLen = s.Length;
			var res = new int[size];
			var resIdx = 0;
			var start = 0;
			string ss;

			for (int i = 1; i <= sLen; i++)
			{
				if ((i == sLen || s[i] == ' '))
				{
					ss = s.Substring(start, i - start);
					{
						res[resIdx++] = int.Parse(ss);
						start = i + 1;
					}
				}
			}
			return res;
		}

		//////////////////

		private static int ReadInt(string s) => int.Parse(s);

		private static int ReadInt() => int.Parse(Console.ReadLine());

		/////////

		static int Mod(int A, int n)
		{
			var a = A / n;
			if (A < 0)
			{
				return A - a * n + n;
			}
			else
			{
				return A - a * n;
			}
		}
	}
}