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
#include <bits/stdc++.h>
#include <tuple>
#include "cielib.h"
#define mt(a, b) make_tuple(a, b)
#define e(a, b) get<a>(b);
using namespace std;
set<tuple<int, int> > kopiec;
int main()
{
	//ios_base::sync_with_stdio(0);
	//cin.tie(0);
	int d=podajD(), k=podajK(), r=podajR();
	int pozycja[d];
	int pozycja2[d];
	int dol[d];
	int gora[d];
	for (int i=0; i<d; i++)
	{
		dol[i]=0;
		gora[i]=r;
		pozycja[i]=r/2;
		kopiec.insert(mt(r+1, i));
	}
	for (;kopiec.size();)
	{
		int s=e(1,*(kopiec.rbegin()));
		kopiec.erase(*(kopiec.rbegin()));
		if (gora[s]-dol[s]==2)
		{
			pozycja[s]=gora[s];
			czyCieplo(pozycja);
			pozycja[s]=dol[s];
			bool pom1=czyCieplo(pozycja);
			pozycja[s]=gora[s];
			bool pom2=czyCieplo(pozycja);
			if (!pom1 && !pom2)
			{
				gora[s]=dol[s]=dol[s]+1;
			}
			else if (pom1)
			{
				gora[s]=dol[s];
			}
			else
			{
				dol[s]=gora[s];
			}
			pozycja[s]=dol[s];
			continue;
		}
		pozycja[s]=gora[s];
		czyCieplo(pozycja);
		pozycja[s]=dol[s];
		bool pom1=czyCieplo(pozycja);
		if (pom1)
			gora[s]=(gora[s]+dol[s])/2+1;
		else
			dol[s]=(gora[s]+dol[s])/2;
		kopiec.insert(mt(gora[s]-dol[s],s));
		pozycja[s]=(gora[s]+dol[s])/2;
	}
	znalazlem(pozycja);
}