#nullable enable using System.Runtime.CompilerServices; #region var (_input, _iter) = (Array.Empty(), 0); T I() where T : IParsable { while (_iter >= _input.Length) (_input, _iter) = (Console.ReadLine()!.Split(' ', StringSplitOptions.RemoveEmptyEntries), 0); return T.Parse(_input[_iter++], null); } #endregion var n = I(); var a = I(); var b = I(); var c = I(); var g = new Grid2(n, n); var nz = new List<(int, int)>(){ (a, 1), (c, 3) }; nz.Sort(); nz.Add((b, 2)); var x = 3; var k = 0; var m = -1; for (var i = 0; i < n; i++) for (var j = 0; j < n; j++) { if (g[i, j] != 0) continue; while (k <= 0) { x--; (k, m) = nz[x]; } k--; g[i, j] = m; } Console.WriteLine(g.Joined()); partial class Grid2(int _l0, int _l1) { public int L0 => _l0; public int L1 => _l1; readonly T[] _data = new T[_l0 * _l1]; public ref T this[int i, int j] { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => ref _data[i * _l1 + j]; } public void Fill(T value) => _data.AsSpan().Fill(value); public bool Inside(int i, int j) => (uint)i < (uint)_l0 && (uint)j < (uint)_l1; } partial class Grid2 { public ReadOnlySpan Row(int i) => _data.AsSpan(i * _l0, _l1); public string Joined() { var res = new List(); for (var i = 0; i < _l0; i++) res.Add(string.Join("", [.. Row(i)])); return string.Join(Environment.NewLine, res); } }