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
#include "cielib.h"
#include <cassert>
#include <cstdio>
#include <algorithm>
#define fru(j,n) for(int j=0;j<(n);++j)

const int MAXD=505;

int G[MAXD],D[MAXD];

int main() {
	 srand(42);
	 int d = podajD(),r=podajR();
	 int t[d];
	 fru(i,d) G[i]=r;
	 fru(i,d) D[i]=0;
	 int ile=0;
	 while(ile!=d) fru(e,d) if(G[e]!=D[e]){
		  int prob=0;
		  while(1){
				++prob;
				bool zle=0;
				fru(i,d) {
					 if(D[i]==G[i]) t[i]=G[i];
					 else{
						 if((G[i]-D[i])%2==1) t[i]=(G[i]+D[i]+rand()%2)/2;
						 else {
							  if(prob>8) t[i]=(G[i]+D[i]+rand()%3-1)/2;
							  else t[i]=(G[i]+D[i]+rand()%2)/2;
						 }
					 }
				}
				int a=D[e],b=G[e];
				assert(a<b);
				t[e]=a;
				czyCieplo(t);
				
				t[e]=b;
				bool x=czyCieplo(t);
				if((b-a)%2==0){
//					 printf("pytalem o "); fru(i,d) printf("%d ",t[i]); printf(" i dostalem %d\n",x);
					 if(x) D[e]=(a+b)/2+1;
					 else G[e]=(a+b)/2;
				}
				else{
					 if(x) D[e]=(a+b)/2+1;
					 else{
						  t[e]=a;
						  bool y=czyCieplo(t);
						  if(y==1) G[e]=(a+b)/2;
						  else {
								zle=1;
//								printf("nie udalo mi sie, ile = %d\n",ile); fru(i,d) printf("[%d,%d] ",D[i],G[i]); puts("");
//								printf("probowalem z :\n"); fru(i,d) printf("%d ",t[i]); puts("");
						  }
					 }
				}
				if(D[e]==G[e]) ++ile;
				if(zle==0) break;
		  }
//		  printf("teraz dla wymiaru %d mam [%d,%d]\n",e,D[e],G[e]);
//		  if(!sprawdz(D,G)) exit(1);
	 }
	 fru(i,d) t[i]=G[i];
	 znalazlem(t);
}