Problem:
Score : 200 points

Problem Statement

Alice and Bob are controlling a robot. They each have one switch that controls the robot.

Alice started holding down her button A second after the start-up of the robot, and released her button B second after the start-up.

Bob started holding down his button C second after the start-up, and released his button D second after the start-up.

For how many seconds both Alice and Bob were holding down their buttons?

Constraints

0≤A<B≤100

0≤C<D≤100

All input values are integers.

Input

Input is given from Standard Input in the following format:

A B C D

Output

Print the length of the duration (in seconds) in which both Alice and Bob were holding down their buttons.

Sample Input 1

0 75 25 100

Sample Output 1

50

Alice started holding down her button 0 second after the start-up of the robot, and released her button 75 second after the start-up.

Bob started holding down his button 25 second after the start-up, and released his button 100 second after the start-up.

Therefore, the time when both of them were holding down their buttons, is the 50 seconds from 25 seconds after the start-up to 75 seconds after the start-up.

Sample Input 2

0 33 66 99

Sample Output 2

0

Alice and Bob were not holding their buttons at the same time, so the answer is zero seconds.

Sample Input 3

10 90 20 80

Sample Output 3

60

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Linq;
using System.Collections.Generic;

class ConsoleApp1
{
    public static void Main(string[] args)
    {
        var nums = Console.ReadLine()
            .Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
            .Select(x => int.Parse(x))
            .ToList();
        var rag1 = new Range(nums[1], nums[0]);
        var rag2 = new Range(nums[3], nums[2]);
        var result = rag1.Superimpose(rag2);
        if (result==null)
            Console.WriteLine(0);
        else
            Console.WriteLine(result.Max - result.Min);
        Console.ReadKey();
    }

    public class Range
    {
        public int Max { get; }
        public int Min { get; }
        public Range(int max, int min)
        {
            Max = max;
            Min = min;
        }
        public bool IsContain(int param)
        {
            return param <= Max && param >= Min ? true : false;
        }
        public Range Superimpose(Range range)
        {
            int max;int min;
            max = range.Max >= Max ? Max : range.Max;
            min = range.Min <= Min ? Min : range.Min;
            if ((IsContain(max) && range.IsContain(max) && (IsContain(min) && range.IsContain(min))))
                return new Range(max, min);
            else
                return null;
        }
    }
}