#include <iostream>
#include <cstdio>
#include <algorithm>
#include <utility>
#include "message.h"
#include "krazki.h"
using namespace std;
long long a[2000010], c[2000010], mx[110], mn[110], moje1[2000010];
int b[2000010], d[2000010], e[2000010], f[110], pampara[110], moje2[2000010];
int main(){
	int x, n, k, m, y, v, t, ksz, psz, pocz, koni, woln;
	long long q, u, msz, nsz;
	x = PipeHeight();
	n = NumberOfNodes();
	k = NumberOfDiscs();
	m = MyNodeId();
	y = x / n;
	if (x % n > m)
		y++;
	t = (x / n) * m + min(x % n, m);
	if (y != 0)
		u = HoleDiameter(1 + t);
	v = 1 + t;
	for (int i = 2; i <= y; i++){
		q = HoleDiameter(i + t);
		if (q < u){
			b[0]++;
			a[b[0]] = u;
			b[b[0]] = v;
			u = q;
			v = i + t;
		}
	}
	b[0]++;
	a[b[0]] = u;
	b[b[0]] = v;
	q = a[b[0]];
	if (m > 0){
		Receive(m - 1);
		u = GetLL(m - 1);
		q = min(u, q);
	}
	if (m + 1 < n){
		PutLL(m + 1, q);
		Send(m + 1);
	}
	if (m > 0){
		v = t + 1;
		for (int i = 1; i <= b[0]; i++){
			if (q < a[i]){
				a[i] = q;
				b[i] = t + 1;
			}
		}
	}
	mx[m] = a[b[0]];
	mn[m] = a[1];
	for (int i = 0; i < n; i++){
		if (i == m)
			continue;
		PutLL(i, a[1]);
		PutLL(i, a[b[0]]);
		Send(i);
	}
	for (int i = 0; i < n; i++){
		if (i == m)
			continue;
		Receive(i);
		mn[i] = GetLL(i);
		mx[i] = GetLL(i);
	}
	y = k / n;
	if (k % n > m)
		y++;
	t = (k / n) * m + min(k % n, m);
	if (y != 0)
		c[1] = DiscDiameter(t + 1);
	d[0] = 1; d[1] = 1;
	for (int i = 2; i <= y; i++){
		q = DiscDiameter(i + t);
		if (q > c[d[0]]){
			d[0]++;
			c[d[0]] = q;
			d[d[0]] = 1;
		}
		else{
			d[d[0]]++;
		}
	}
	q = c[d[0]];
	if (m > 0){
		Receive(m - 1);
		u = GetLL(m - 1);
		q = max(u, q);
	}
	if (m + 1 < n){
		PutLL(m + 1, q);
		Send(m + 1);
	}
	if (m > 0){
		for (int i = 1; i <= d[0]; i++){
			if (q > c[i]){
				c[i] = q;
			}
		}
	}
	for (int i = 1; i <= d[0]; i++){
		int l, r;
		l = 1; r = n;
		int bin;
		while (mn[l - 1] != mn[r - 1]){
			bin = (r + l) / 2;
			if (mx[bin] < c[i])
				r = t;
			else{
				l = t;
			}
		}
		e[i] = r - 1;
		f[r - 1]++;
	}
	for (int i = 0; i < n; i++){
		if (i == m)
			continue;
		PutInt(i, f[i]);
		Send(i);
	}
	for (int i = 1; i <= d[0]; i++){
		if (e[i] == m){
			moje2[0]++;
			moje1[moje2[0]] = c[i];
			moje2[moje2[0]] = d[i];
		}
		else{
			PutLL(e[i], c[i]);
			PutInt(e[i], d[i]);
			pampara[e[i]] = pampara[e[i]] + 2;
			if (pampara[e[i]] = 8100){
				Send(e[i]);
			}
		}
	}
	for (int i = 0; i < n; i++){
		if (i == m)
			continue;
		if (pampara[i] != 0){
			Send(i);
		}
	}
	pocz = -1;
	int iter;
	for (int i = 0; i < n; i++){
		if (i == m){
			for (int j = 1; j <= moje2[0]; j++){
				int l, r, bin;
				l = 1; r = b[0];
				while (a[l] != a[r]){
					bin = (l + r) / 2;
					if (a[l] > moje1[i])
						l = bin;
					else
						r = bin;
				}
				if (pocz = -1){
					pocz = b[r];
					koni = b[r] - moje2[i] + 1;
				}
				else{
					koni = min(koni, b[r]) - ksz + 1;
					woln = woln + max(b[r] - koni, 0);
				}
			}
		}
		else{
			pampara[i] = 0;
			Receive(i);
			iter = GetInt(i);
			Receive(i);
			for (int j = 1; j <= iter; j++){
				msz = GetLL(i);
				ksz = GetInt(i);
				int l, r, bin;
				l = 1; r = b[0];
				while (a[l] != a[r]){
					bin = (l + r) / 2;
					if (a[l] > msz)
						l = bin;
					else
						r = bin;
				}
				if (pocz = -1){
					pocz = b[r];
					koni = b[r] - ksz + 1;
				}
				else{
					koni = min(koni, b[r]) - ksz + 1;
					woln = woln + max(b[r] - koni, 0);
				}
				pampara[i] = pampara[i] + 2;
				if (pampara[i] == 8100){
					pampara[i] = 0;
					Receive(i);
				}
			}
		}
	}
	if (m > 0){
		PutInt(0, pocz);
		PutInt(0, koni);
		PutInt(0, woln);
		Send(0);
	}
	else{
		int costam1, costam2, costam3, temp;
		for (int i = 1; i < n; i++){
			Receive(i);
			costam1 = GetInt(i);
			costam2 = GetInt(i);
			costam3 = GetInt(i);
			temp = costam2;
			temp = temp - max(costam3 - (costam1 - koni + 1), 0);
			koni = temp;
		}
	}
	cout << max(koni, 0);
	//system("pause");
}
        | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 | #include <iostream> #include <cstdio> #include <algorithm> #include <utility> #include "message.h" #include "krazki.h" using namespace std; long long a[2000010], c[2000010], mx[110], mn[110], moje1[2000010]; int b[2000010], d[2000010], e[2000010], f[110], pampara[110], moje2[2000010]; int main(){ int x, n, k, m, y, v, t, ksz, psz, pocz, koni, woln; long long q, u, msz, nsz; x = PipeHeight(); n = NumberOfNodes(); k = NumberOfDiscs(); m = MyNodeId(); y = x / n; if (x % n > m) y++; t = (x / n) * m + min(x % n, m); if (y != 0) u = HoleDiameter(1 + t); v = 1 + t; for (int i = 2; i <= y; i++){ q = HoleDiameter(i + t); if (q < u){ b[0]++; a[b[0]] = u; b[b[0]] = v; u = q; v = i + t; } } b[0]++; a[b[0]] = u; b[b[0]] = v; q = a[b[0]]; if (m > 0){ Receive(m - 1); u = GetLL(m - 1); q = min(u, q); } if (m + 1 < n){ PutLL(m + 1, q); Send(m + 1); } if (m > 0){ v = t + 1; for (int i = 1; i <= b[0]; i++){ if (q < a[i]){ a[i] = q; b[i] = t + 1; } } } mx[m] = a[b[0]]; mn[m] = a[1]; for (int i = 0; i < n; i++){ if (i == m) continue; PutLL(i, a[1]); PutLL(i, a[b[0]]); Send(i); } for (int i = 0; i < n; i++){ if (i == m) continue; Receive(i); mn[i] = GetLL(i); mx[i] = GetLL(i); } y = k / n; if (k % n > m) y++; t = (k / n) * m + min(k % n, m); if (y != 0) c[1] = DiscDiameter(t + 1); d[0] = 1; d[1] = 1; for (int i = 2; i <= y; i++){ q = DiscDiameter(i + t); if (q > c[d[0]]){ d[0]++; c[d[0]] = q; d[d[0]] = 1; } else{ d[d[0]]++; } } q = c[d[0]]; if (m > 0){ Receive(m - 1); u = GetLL(m - 1); q = max(u, q); } if (m + 1 < n){ PutLL(m + 1, q); Send(m + 1); } if (m > 0){ for (int i = 1; i <= d[0]; i++){ if (q > c[i]){ c[i] = q; } } } for (int i = 1; i <= d[0]; i++){ int l, r; l = 1; r = n; int bin; while (mn[l - 1] != mn[r - 1]){ bin = (r + l) / 2; if (mx[bin] < c[i]) r = t; else{ l = t; } } e[i] = r - 1; f[r - 1]++; } for (int i = 0; i < n; i++){ if (i == m) continue; PutInt(i, f[i]); Send(i); } for (int i = 1; i <= d[0]; i++){ if (e[i] == m){ moje2[0]++; moje1[moje2[0]] = c[i]; moje2[moje2[0]] = d[i]; } else{ PutLL(e[i], c[i]); PutInt(e[i], d[i]); pampara[e[i]] = pampara[e[i]] + 2; if (pampara[e[i]] = 8100){ Send(e[i]); } } } for (int i = 0; i < n; i++){ if (i == m) continue; if (pampara[i] != 0){ Send(i); } } pocz = -1; int iter; for (int i = 0; i < n; i++){ if (i == m){ for (int j = 1; j <= moje2[0]; j++){ int l, r, bin; l = 1; r = b[0]; while (a[l] != a[r]){ bin = (l + r) / 2; if (a[l] > moje1[i]) l = bin; else r = bin; } if (pocz = -1){ pocz = b[r]; koni = b[r] - moje2[i] + 1; } else{ koni = min(koni, b[r]) - ksz + 1; woln = woln + max(b[r] - koni, 0); } } } else{ pampara[i] = 0; Receive(i); iter = GetInt(i); Receive(i); for (int j = 1; j <= iter; j++){ msz = GetLL(i); ksz = GetInt(i); int l, r, bin; l = 1; r = b[0]; while (a[l] != a[r]){ bin = (l + r) / 2; if (a[l] > msz) l = bin; else r = bin; } if (pocz = -1){ pocz = b[r]; koni = b[r] - ksz + 1; } else{ koni = min(koni, b[r]) - ksz + 1; woln = woln + max(b[r] - koni, 0); } pampara[i] = pampara[i] + 2; if (pampara[i] == 8100){ pampara[i] = 0; Receive(i); } } } } if (m > 0){ PutInt(0, pocz); PutInt(0, koni); PutInt(0, woln); Send(0); } else{ int costam1, costam2, costam3, temp; for (int i = 1; i < n; i++){ Receive(i); costam1 = GetInt(i); costam2 = GetInt(i); costam3 = GetInt(i); temp = costam2; temp = temp - max(costam3 - (costam1 - koni + 1), 0); koni = temp; } } cout << max(koni, 0); //system("pause"); } | 
 
            
         English
                    English