рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ: рдмрд╛рдЗрдирд░реА рд╣реАрдк

рдмрд╛рдЗрдирд░реА рд╣реАрдк рдПрдХ рдмрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЬрд▓реНрджреА рд╕реЗ (рд▓рдШреБрдЧрдгрдХ рд╕рдордп рдореЗрдВ) рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдЙрдЪреНрдЪрддрдо рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╡рд╛рд▓реЗ рдПрдХ рддрддреНрд╡ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдп)ред



рдЖрдЧреЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреЗрдбрд╝реЛрдВ рдХрд╛ рдПрдХ рд╡рд┐рдЪрд╛рд░ рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдФрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдЖрдХрд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдирд╛ рднреА рдЙрдЪрд┐рдд рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдПрд▓реНрдЧреЛрд░рд┐рджрдо C # рдХреЛрдб рдХреЗ рд╕рд╛рде рд╣реЛрдЧрд╛ред



рдкрд░рд┐рдЪрдп



рдмрд╛рдЗрдирд░реА рд╣реАрдк рдПрдХ рдкреВрд░реНрдг рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдвреЗрд░ рдХреА рдореБрдЦреНрдп рд╕рдВрдкрддреНрддрд┐ рд╕рдВрддреБрд╖реНрдЯ рд╣реИ: рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдЙрд╕рдХреЗ рд╡рдВрд╢ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред рд╕рдмрд╕реЗ рд╕рд░рд▓ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЛ рдЙрд╕рдХреЗ рдореВрд▓реНрдп рдХреЗ рдмрд░рд╛рдмрд░ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЕрдзрд┐рдХрддрдо-рдвреЗрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдк- рд░реВрдЯ рдХреА рдЬрдбрд╝реЗрдВ рдЙрдкрд░реА рдХреЗ рддрддреНрд╡реЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреА рдЕрдзрд┐рдХрддрдо рд╣реЛрддреА рд╣реИрдВред рдпрд╣ рд▓реЗрдЦ рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рдкреЗрдбрд╝ рдХреЛ рдкреВрд░реНрдг рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдкрд░ рджреЛ рд╕реЗ рдЕрдзрд┐рдХ рд╡рдВрд╢рдЬ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдХреЛ рднрд░рдиреЗ рд╕реЗ рдКрдкрд░ рд╕реЗ рдиреАрдЪреЗ (рд╕рдорд╛рди рд╕реНрддрд░ рд╕реЗ - рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ) рдЬрд╛рддрд╛ рд╣реИред







рдмрд╛рдЗрдирд░реА рд╣реАрдк рдХреЛ рд╡рди-рдбрд╛рдпрдореЗрдВрд╢рдирд▓ рдРрд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рд╕рд╛рде рд╡рд░реНрдЯреЗрдХреНрд╕ рдХреЗ рдмрд╛рдПрдВ рд╡рдВрд╢рдЬ рдХреЗ рд╕рд╛рде рдЗрдВрдбреЗрдХреНрд╕ 2*i+1



, рдФрд░ рд░рд╛рдЗрдЯ рд╡рди 2*i+2



ред рдкреЗрдбрд╝ рдХреА рдЬрдбрд╝ рдЗрдВрдбреЗрдХреНрд╕ 0. рдХреЗ рд╕рд╛рде рдПрдХ рддрддреНрд╡ рд╣реИред рдмрд╛рдЗрдирд░реА рд╣реАрдк рдХреА рдКрдВрдЪрд╛рдИ рдкреЗрдбрд╝ рдХреА рдКрдВрдЪрд╛рдИ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдЕрд░реНрдерд╛рдд 2 рдПрди рд▓реЙрдЧ рдХрд░реЗрдВ, рдЬрд╣рд╛рдВ N



рд╕рд░рдгреА рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред



рдореИрдВ C # рдореЗрдВ рдПрдХ рдХреНрд▓рд╛рд╕ рдЦрд╛рд▓реА рджреВрдВрдЧрд╛:



 public class BinaryHeap { private List<int> list; public int heapSize { get { return this.list.Count(); } } }
      
      





рдЖрдЗрдЯрдо рдЬреЛрдбрд╝реЗрдВ



рдирдП рддрддреНрд╡ рдХреЛ рд╕рд░рдгреА рдореЗрдВ рдЕрдВрддрд┐рдо рд╕реНрдерд╛рди рдкрд░ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ, heapSize



, heapSize



рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐:







рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдпрд╣ рдвреЗрд░ рдХреА рдореБрдЦреНрдп рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдирдпрд╛ рддрддреНрд╡ рдорд╛рддрд╛-рдкрд┐рддрд╛ рд╕реЗ рдмрдбрд╝рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдирдП рддрддреНрд╡ рдПрдХ рд╕реНрддрд░ (рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рд╕рд╛рде рдмрджрд▓рд╛рд╡) рдХреЛ "рдКрдкрд░" рдЙрдард╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдХрд┐ рдвреЗрд░ рдХреА рдореБрдЦреНрдп рд╕рдВрдкрддреНрддрд┐ рдирд╣реАрдВ рджреЗрдЦреА рдЬрд╛рддреА рд╣реИ:











рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдПрдХ рдирдпрд╛ рддрддреНрд╡ "рдкреЙрдк рдЕрдк", "рдКрдкрд░" рдзрдХреЗрд▓рддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдЕрдкрдиреА рдЬрдЧрд╣ рдирд╣реАрдВ рд▓реЗрддрд╛ рд╣реИред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдмрд╛рдЗрдирд░реА рд╣реАрдк рдХреА рдКрдВрдЪрд╛рдИ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИ (рдЪреВрдВрдХрд┐ "рд▓рд┐рдлреНрдЯ" рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреЗрдбрд╝ рдХреА рдКрдВрдЪрд╛рдИ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИ), рдЕрд░реНрдерд╛рдд рдпрд╣ рдУ (рд▓реЙрдЧ 2 рдПрди) рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред



 public void add(int value) { list.Add(value); int i = heapSize - 1; int parent = (i - 1) / 2; while (i > 0 && list[parent] < list[i]) { int temp = list[i]; list[i] = list[parent]; list[parent] = temp; i = parent; parent = (i - 1) / 2; } }
      
      





рдмрд╛рдЗрдирд░реА рд╣реАрдк рдСрд░реНрдбрд░рд┐рдВрдЧ



рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд┐рд░реНрдорд┐рдд рдмрд╛рдЗрдирд░реА рд╣реАрдк рдХреЗ рд╕рд╛рде рдЕрдиреНрдп рд╕рдВрдЪрд╛рд▓рди рдХреЗ рджреМрд░рд╛рди, рдвреЗрд░ рдХреА рдореБрдЦреНрдп рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рднреА рдЙрд▓реНрд▓рдВрдШрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: рд╢реАрд░реНрд╖ рдЕрдкрдиреЗ рд╡рдВрд╢ рд╕реЗ рдЫреЛрдЯрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред







heapify



рд╡рд┐рдзрд┐ рдПрдХ рдкреЗрдбрд╝ рдХреЗ рд▓рд┐рдП рдореВрд▓ рдвреЗрд░ рд╕рдВрдкрддреНрддрд┐ рдХреЛ i-th рд╢реАрд░реНрд╖ рдкрд░ рдПрдХ рдЬрдбрд╝ рдХреЗ рд╕рд╛рде рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреА рд╣реИ, рдмрд╢рд░реНрддреЗ рдХрд┐ рджреЛрдиреЛрдВ рдЙрдкрдкреНрд░рдХрд╛рд░ рдЙрд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рдХрд░ рд╕рдХреЗрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдЬрдм рддрдХ рдореБрдЦреНрдп рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдмрд╣рд╛рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рддрдм рддрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИ (рдЬрдм рдХреЛрдИ рд╡рдВрд╢рдЬ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЙрд╕рдХреЗ рдмрдбрд╝реЗ рдорд╛рддрд╛-рдкрд┐рддрд╛)ред рдпрд╣ рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рдЬрдЯрд┐рд▓рддрд╛ рднреА рдУ (рд▓реЙрдЧ 2 рдПрди) рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред











 public void heapify(int i) { int leftChild; int rightChild; int largestChild; for (; ; ) { leftChild = 2 * i + 1; rightChild = 2 * i + 2; largestChild = i; if (leftChild < heapSize && list[leftChild] > list[largestChild]) { largestChild = leftChild; } if (rightChild < heapSize && list[rightChild] > list[largestChild]) { largestChild = rightChild; } if (largestChild == i) { break; } int temp = list[i]; list[i] = list[largestChild]; list[largestChild] = temp; i = largestChild; } }
      
      





рдПрдХ рдмрд╛рдЗрдирд░реА рд╣реАрдк рдХрд╛ рдирд┐рд░реНрдорд╛рдг



рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╕рд░рдгреА рд╕реЗ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдмрдирд╛рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХрд╛ рдмрджрд▓реЗ рдореЗрдВ рдЕрдкрдиреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рд╕рдордп рдЕрдиреБрдорд╛рди рд╣реЗ (рдПрди рд▓реЙрдЧ 2 рдПрди) рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдк рддреЗрдЬреА рд╕реЗ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдУ (рдПрди) рдХреЗ рд▓рд┐рдПред рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рд╕рд░рдгреА рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рд╕реЗ рдПрдХ рдкреЗрдбрд╝ рдмрдирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рди рдХрд┐ рдвреЗрд░ рдХреА рдореБрдЦреНрдп рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдФрд░ рдлрд┐рд░ рд╕рднреА heapify



рд▓рд┐рдП heapify



рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ, heapify



рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╡рдВрд╢рдЬ рд╣реЛ (рдЪреВрдВрдХрд┐ рдПрдХ рд╡рдВрд╢ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╢реАрд░реНрд╖ рд╕реЗ рдорд┐рд▓рдХрд░ рдЙрдк-рдХреНрд░рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдСрд░реНрдбрд░ рдХрд┐рдП рдЧрдП рд╣реИрдВ)ред рдкрд╣рд▓реЗ heapSize/2



рд╡рдВрд╢рдЬ рд╣реЛрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рджреА рдЬрд╛рддреА рд╣реИред



 public void buildHeap(int[] sourceArray) { list = sourceArray.ToList(); for (int i = heapSize / 2; i >= 0; i--) { heapify(i); } }
      
      





рдЕрдзрд┐рдХрддрдо рддрддреНрд╡ рдХрд╛ рдирд┐рд╖реНрдХрд░реНрд╖рдг (рдирд┐рд╖реНрдХрд╛рд╕рди)



рдЖрджреЗрд╢рд┐рдд max-heap



рдЕрдзрд┐рдХрддрдо рддрддреНрд╡ рд╣рдореЗрд╢рд╛ рд░реВрдЯ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддрд╛ рд╣реИред рдЖрдк рдЕрдВрддрд┐рдо рддрддреНрд╡ рдХреЛ рдЙрд╕рдХреЗ рд╕реНрдерд╛рди рдкрд░ heapify



рдФрд░ рдкреВрд░реЗ рдкреЗрдбрд╝ рдХреЛ рдСрд░реНрдбрд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд░реВрдЯ рдХреЗ рд▓рд┐рдП heapify



рдХрд╣рдХрд░ рдЕрдзрд┐рдХрддрдо рддрддреНрд╡ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдмрд╛рдЗрдирд░реА рд╣реАрдк рдХреЗ рдСрд░реНрдбрд░ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред



 public int getMax() { int result = list[0]; list[0] = list[heapSize - 1]; list.RemoveAt(heapSize - 1); return result; }
      
      





рдмрд╛рдЗрдирд░реА рд╣реАрдк рд╕реЙрд░реНрдЯ



рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рдПрдХ рдмрд╛рдЗрдирд░реА рд╣реАрдк рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдХреЗ рдПрдХ рд╕рд░рдгреА рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХрддрдо рддрддреНрд╡реЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЗрдП рдРрд╕реЗ рддрддреНрд╡ рдХреА рд╕рдордп рдЬрдЯрд┐рд▓рддрд╛ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░реЗрдВ: рдвреЗрд░ рдирд┐рд░реНрдорд╛рдг - рдУ (рдПрди), N



рддрддреНрд╡реЛрдВ рдХрд╛ рдирд┐рд╖реНрдХрд░реНрд╖рдг - рдУ (рдПрди рд▓реЙрдЧ 2 рдП)ред рдЗрд╕рд▓рд┐рдП, рдЕрдВрддрд┐рдо рд╕реНрдХреЛрд░ рдУ (рдПрди рд▓реЙрдЧ 2 рдПрди) рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред



 public void heapSort(int[] array) { buildHeap(array); for (int i = array.Length - 1; i >= 0; i--) { array[i] = getMax(); heapify(0); } }
      
      





рдирд┐рд╖реНрдХрд░реНрд╖



рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдмрд╛рдЗрдирд░реА рд╣реАрдк рдореЗрдВ рдПрдХ рд▓реЙрдЧрд░рд┐рджрдорд┐рдХ рдКрдВрдЪрд╛рдИ (рд╡рд░реНрдЯреАрдХрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖) рдХреА рдПрдХ рдкреЗрдбрд╝ рд╕рдВрд░рдЪрдирд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рд▓реЙрдЧрд░рд┐рджрдорд┐рдХ рд╕рдордп рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдирд┐рд░рдВрддрд░ рд╕рдордп рдореЗрдВ рдЕрдзрд┐рдХрддрдо рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рддрддреНрд╡ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЙрд╕реА рд╕рдордп, рдмрд╛рдЗрдирд░реА рд╣реАрдк рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдореЛрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред



All Articles