#include <cstdint>
#include <vector>
#include <iostream>
#define N 10
using namespace std;
long long m,pos[1100000];
long long a[1100000]={};
bool vis[1100000]={};
uint64_t query(int l, int r);
uint32_t get(int x);
pair<long long,long long> sf()
{
long long len=0;
for(long long i=1;i<=m;i++)
if(!vis[i])
pos[++len]=i;
if(len<=2)
{
if(len==1)
return {pos[1],get(pos[1])};
long long a=get(pos[1]),b=get(pos[2]);
if(a<b)
return {pos[1],a};
return {pos[2],b};
}
long long s1=len/3+1,s2=len-len/3;
long long ans1=query(1,pos[s2])-query(1,pos[s1]-1);
long long ans2=query(pos[s1],m)-query(pos[s2]+1,m);
if(ans1==ans2)
{
for(long long i=s1;i<=s2;i++)
vis[pos[i]]=true;
}
else if(ans1>ans2)
{
for(long long i=1;i<s1;i++)
vis[pos[i]]=true;
}
else if(ans1<ans2)
{
for(long long i=s2+1;i<=len;i++)
vis[pos[i]]=true;
}
return sf();
}
std::vector<uint32_t> recover(int n)
{
m=n;
pair<long long,long long> ans=sf();
a[ans.first]=ans.second;
for(long long i=ans.first+1;i<=m;i++)
a[i]=query(ans.first,i);
for(long long i=1;i<ans.first;i++)
a[i]=query(i,ans.first);
for(long long i=m;i>ans.first+1;i--)
a[i]=a[i]-a[i-1];
for(long long i=1;i<ans.first-1;i++)
a[i]=a[i]-a[i+1];
std::vector<uint32_t> res(n);
for(long long i=1;i<=n;i++)
res.push_back((uint32_t)a[i]);
return res;
}