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
#include <cstdio>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;
long long o[1300001];
int pot[1300002];
int main()
{
	int n;
	vector < int > A;

	scanf("%d", &n);

	for (int i = 0; i < n; i++)
	{
		int l;
		scanf("%d", &l);
		A.push_back(l);
	}
	sort(A.begin(), A.end());
	int last=0;
	for(int i = 0; i < n; i++)
	{
		int sum=0;
		for (int j=i; A[i]==A[j] && j < n; j++)
		{
			// sumujemy te same, aby miec ich ilosc
			sum++;
			i=j;
		}
		int poz=0;
		while(sum)
		{
			if(sum & 1)
			{
				// zamieniamy je na potegi 2	
				o[A[i] + poz]++;
				last = (last < A[i]+poz ? A[i]+poz : last);
			}
			poz++;
			sum >>=1;
		}
	}
	int L= last;
	for(int i =0; i <= L + 1 ;i++)
	{
		int sum=o[i];
		int poz=0;
		while(sum)
		{
			if (sum & 1)
			{
				if (poz) o[i+poz]++;
				L=(L < i+poz ? i+poz : L);
			}
			poz++;
			sum >>=1;
		}
	}
	printf("%d", L);
	return 0;
}