//#include<stdio.h>
//int main()
//{
// int n;
// int data[20][5] = {},i,j,k;
// int min_nutrient[4] = {};
// int min = 10000;
//
// scanf("%d", &n);
// for(i=0;i<4;i++)
// {
// scanf("%d",&min_nutrient[i]);
// }
// for(i=0;i<n;i++)
// {
// for(j=0;j<5;j++)
// {
// scanf("%d",&data[i][j]);
// }
// }
//
// for(i=0;i<pow(2,n);i++)
// {
// int r[4]= {0,0,0,0};
// int s[]
// for(j=0;j<;j++)
// {
//
// }
// }
//}
//#include <stdio.h>
//int main()
//{
// int n;
// int h[100000]= {};
// int count=1;
// int tmp, i;
// scanf("%d", &n);
// for(i=0; i<n; i++)
// {
// scanf("%d", &h[i]);
// }
// tmp = h[n-1];
// for(i=n-2; i>=0; i--)
// {
// if(h[i]>tmp)
// {
// tmp=h[i];
// count++;
// }
// }
// printf("%d", count);
//}
//q = 100000000
//result = q
//n = int(input())
//for i in range(n):
// x, y = map(int, input().split())
// if x <= y:
// if result < y:
// result = result
// elif result >= y:
// result = y
//
//if result == q:
// print(-1)
//else:
// print(result)
//#include <stdio.h>
//int main()
//{
// int n, i,j,k, cnt=0;
// scanf("%d", &n);
// for(k=n/3; k<=n/2; k++)
// for(i=1; i<=n/3; i++)
// {
// j = n - (i+k);
// if (i+j > k && (i <=j && j<=k))
// {
// cnt++;
// }
// }
// printf("%d", cnt);
// return 0;
//}
//#include <stdio.h>
//#include <string.h>
//void dfs(int c[10][10], int x, int y)
//{
// if (x < 0 || y < 0 || x > 9 || y > 9 || c[x][y] == 0)
// {
// return;
// }
// c[x][y] = 0;
// dfs(c, x - 1, y);
// dfs(c, x + 1, y);
// dfs(c, x, y - 1);
// dfs(c, x, y + 1);
//}
//int f(int map[10][10])
//{
// int c[10][10] = {};
// memcpy(c, map, sizeof(c));
// int cnt = 0;
// for (int i = 0; i < 10; i++)
// {
// for (int j = 0; j < 10; j++)
// {
// if (c[i][j] == 1)
// {
// cnt++;
// dfs(c, i, j);
// }
// }
// }
// return cnt;
//}
//
//int main()
//{
// int i,j;
// int map[10][10] = {};
// for (i = 0; i < 10; i++)
// {
// for (j = 0; j < 10; j++)
// {
// scanf("%d", &map[i][j]);
// }
// }
// printf("%d", f(map));
// return 0;
//}
//#include<stdio.h>
//int n,i,j,k;
//int max_height=0,max=0,a,arr[505][505]= {},map[505][505]= {};
//void f(int x,int y,int z)
//{
// if(arr[x][y]<=z)
// {
// return;
// }
// if(x==-1||x==n||y==-1||y==n)
// {
// return;
// }
// arr[x][y]=z;
// f(x+1,y,z);
// f(x-1,y,z);
// f(x,y+1,z);
// f(x,y-1,z);
//}
//int main()
//{
// scanf("%d",&n);
// for(i=0; i<n; i++)
// {
// for(j=0; j<n; j++)
// {
// scanf("%d",&arr[i][j]);
// map[i][j]=arr[i][j];
// if(max_height<arr[i][j])
// {
// max_height=arr[i][j];
// }
// }
// }
// for(k=0; k<=max_height; k++)
// {
// a=0;
// for(i=0; i<n; i++)
// {
// for(j=0; j<n; j++)
// {
// if(arr[i][j]>k)
// {
// f(i,j,k);
// a++;
// }
// arr[i][j]=map[i][j];
// }
// }
// if(max<a)
// {
// max=a;
// }
// }
// printf("%d",max);
// return 0;
//}
//#include <stdio.h>
//#define IMPOSSIBLE -987654321
//#define max(x,y) ((x) > (y) ? (x) : (y))
//int dp[101][100001];
//int walk_min[101];
//int walk_get[101];
//int bicy_min[101];
//int bicy_get[101];
//int n, k;
//int get(int segment, int minute_left)
//{
// if (segment >= n)
// {
// return 0;
// }
// if (minute_left <= 0)
// {
// return IMPOSSIBLE;
// }
// int ret = dp[segment][minute_left];
// if (ret != -1)
// {
// return ret;
// }
// ret = IMPOSSIBLE;
// if (minute_left >= walk_min[segment] && get(segment+1, minute_left - walk_min[segment]) != IMPOSSIBLE)
// {
// ret = max(ret, get(segment+1, minute_left - walk_min[segment]) + walk_get[segment]);
// }
// if (minute_left >= bicy_min[segment] && get(segment+1, minute_left - bicy_min[segment]) != IMPOSSIBLE)
// {
// ret = max(ret, get(segment+1, minute_left - bicy_min[segment]) + bicy_get[segment]);
// }
// return ret;
//}
//
//int main()
//{
//
// scanf("%d %d", &n, &k);
// for (int i=0; i < n; i++)
// {
// scanf("%d %d %d %d", &walk_min[i], &walk_get[i], &bicy_min[i], &bicy_get[i]);
// }
// memset(dp, -1, sizeof(dp));
// printf("%d", get(0,n));
// return 0;
//}
//#include <stdio.h>
//int main()
//{
// int i,j;
// char string[5][15] = {};
// for (i = 0; i < 5; i++)
// {
// scanf("%s",string[i]);
// }
// for (i = 0; i < 15; i++)
// {
// for (j = 0; j < 5; j++)
// {
// if (string[j][i] != '\0')
// {
// printf("%c",string[j][i]);
// }
// }
// }
//
// return 0;
//}
//#include<stdio.h>
//int len = 0, r, i = 0;
//long long int max = 0;
//void f(long long int k)
//{
// i++;
// if(k == 1)
// {
// return;
// }
// if(k%3 == 0)
// {
// k /= 3;
// }
// else if(k%3 == 1)
// {
// k = k * 5 - 2;
// }
// else if(k%3 == 2)
// {
// k = k * 5 - 1;
// }
// if(max < k)
// {
// max = k;
// r = i;
// }
// len++;
// f(k);
//}
//int main()
//{
// long long int n;
// scanf("%lld",&n);
// max = n;
// f(n);
// printf("%d\n",len+1);
// printf("%d %lld",r+1, max);
// return 0;
//}
main(n,m)
{
scanf("%d",&n);
m=floor((sqrt(8*n+1)-1)/2);
printf("%d",(int)pow(2, m)*(m+n-m*(m+1)/2-1)+1);
}
# n = int(input())
# a = list(map(int, input().split()))
# b = []
# for i in range(0, n):
# v = list(map(int, input().split()))
# b.append(v)
# d = 1000000000
# list = []
# for i in range(2**n):
# r = [0, 0, 0, 0]
# s = []
# c = 0
# for j in range(n):
# if (i >> j) & 1 == 1:
# s.append(j+1)
# for k in range(4):
# r[k] += b[j][k]
# c += b[j][4]
# g = 1
# for j in range(4):
# if r[j] < a[j]:
# g = 0
# if g:
# if d > c:
# d = c
# list = s
# if d == c and list > s:
# list = s
# if d > 100000000:
# print(-1)
# else:
# print(d)
# for i in range(len(list)):
# print(list[i], end=' ')
#
#
# n, k = map(int, input().split())
# n -= k * (k + 1) / 2
# if n < 0:
# print(-1)
# else:
# if n % k == 0:
# print(k - 1)
# else:
# print(k)
# n, k = map(int, input().split())
# s = list(input())
# j, ans = 0, 0
# for i in range(n):
# if s[i] == 'H':
# continue
# else:
# for j in range(max(j, i-k), min(n, i+k+1)):
# if s[j] == 'P':
# continue
# else:
# ans += 1
# j += 1
# break
# print(ans)
# t = int(input())
# for i in range(t):
# n = int(input())
# a = 0
# b = 0
# c = 0
# d = 0
# e = 0
# a += int(n / 60)
# n %= 60
# if n > 35:
# a += 1
# c = 6 - int((n + 5)/10)
# n %= 10
# if n >= 5:
# e += 10 - n
# else:
# d += n
# else:
# b = int((n + 4)/10)
# n %= 10
# if n >= 6:
# e += 10 - n
# else:
# d += n
# print(a, b, c, d, e)
# n = int(input())
# data = []
# ans = 0
# for i in range(n):
# v = int(input())
# data.append(v)
# for i in range(1, n):
# if data[i] > data[n-1]:
# ans += 1
# print(ans+1)
def plus():
k = 0
for m in range(n):
k += data[m]
return k
def plus2():
p = 0
for m in range(n-1):
p += data[m]
return p
# data = []
# tmp = 0
# tmp2 = 0
# num = 0
# n = int(input())
# data = input().split()
# for i in range(n):
# data[i] = int(data[i])
# for i in range(n):
# tmp2 = plus2()
# if tmp2 == 0:
# print(num+1)
# break
# if data[i] == 0:
# continue
# data[i+1] -= data[i]
# data[i] = 0
# num += 1
# tmp = plus()
# if tmp == 0:
# print(num)
# break
# import sys
# def go(idx, total):
# if total < 0:
# return -9876543210
# if idx == n:
# return 0
# if dp[idx][total] != -1:
# return dp[idx][total]
# dp[idx][total] = max(go(idx + 1, total - arr[idx][0]) + arr[idx][1], go(idx + 1, total - arr[idx][2]) + arr[idx][3])
# return dp[idx][total]
#
#
# n, k = map(int, sys.stdin.readline().split())
# dp = [[-1] * (k + 1) for _ in range(n)]
# arr = [list(map(int, sys.stdin.readline().split())) for i in range(n)]
# print(go(0, k))
data = []
max = 0
for i in range(5):
v = list(input())
data.append(v)
for i in range(5):
if max < len(data[i]):
max = len(data[i])
for ii
for i in range(max):
for j in range(5):
print(data[j][i], end='')