using System; using System.Collections; public abstract class IntSequence: IEnumerable { public abstract IEnumerator GetEnumerator(); public abstract int? Min {get;} public abstract int? Max {get;} } public class IntInterval: IntSequence{ private int from, to; public IntInterval(int from, int to){ this.from = from; this.to = to; } public override int? Min{ get {return Math.Min(from,to);} } public override int? Max{ get {return Math.Max(from,to);} } public override IEnumerator GetEnumerator (){ if (from < to) for(int i = from; i <= to; i++) yield return i; else for(int i = from; i >= to; i--) yield return i; } } public class IntSingular: IntSequence{ private int it; public IntSingular(int it){ this.it = it; } public override int? Min{ get {return it;} } public override int? Max{ get {return it;} } public override IEnumerator GetEnumerator(){ yield return it; } } // Binary sequence: Exactly two subsequences. public class IntCompSeq: IntSequence{ private IntSequence s1, s2; public IntCompSeq(IntSequence s1, IntSequence s2) { this.s1 = s1; this.s2 = s2; } public override int? Min{ get {return (s1.Min < s2.Min) ? s1.Min : s2.Min;} } public override int? Max{ get {return (s1.Max > s2.Max) ? s1.Max : s2.Max;} } public override IEnumerator GetEnumerator (){ foreach(int i in s1) yield return i; foreach(int i in s2) yield return i; } }