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
#include <bits/stdc++.h>
using namespace std;

long long k_Kadane(vector <long long>& zmiany_rankingu, int n, int k)
{
	long long max_globalne = LLONG_MIN, max_lokalne = 0;
	
	for(int i = 0; i < k; i++)
	{
		max_lokalne += zmiany_rankingu[i];
	}
	
	max_globalne = max_lokalne;
	
	for(int i = k; i < n; i++)
	{
		max_lokalne += zmiany_rankingu[i] - zmiany_rankingu[i - k];
		max_globalne = max(max_globalne, max_lokalne);
	}
	
	return max_globalne;
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

	int n;
	cin >> n;
	
	vector <int> maksymalna_suma(n);
	vector <long long> zmiany_rankingu(n);
	
	for(int i = 0; i < n; i++)
	{
		cin >> maksymalna_suma[i];
	}
	
	zmiany_rankingu[0] = maksymalna_suma[0];
	
	for(int i = 1; i < n; i++)
	{
		zmiany_rankingu[i] = (long long) maksymalna_suma[i] - maksymalna_suma[i - 1];
	}
		
	bool ok = true;
	
	for(int i = 1; i <= n; i++)
	{
		// sprawdzenie czy proponowany ciag zmian rankingu jest poprawny
		if(k_Kadane(zmiany_rankingu, n, i) != maksymalna_suma[i - 1])
		{
			ok = false;
			break;
		}
	}
	
	if(ok)
	{
		cout << "TAK\n" << n << "\n";
		
		for(int i = 0; i < n; i++)
		{
			cout << zmiany_rankingu[i] << " ";
		}
		
		cout << "\n";
	}
	
	else
	{
		cout << "NIE\n";
	}
	
	return 0;
}