(Analysis by Benjamin Qi)

For each $i$ from $1$ to $N,$ try setting $a_1=i.$ Then we can determine the rest of the elements of $a$ by setting $a_i=b_{i-1}-a_{i-1}$ for each $2\le i\le N.$ If this indeed produces a valid permutation (all elements of $a$ are in $[1,N]$ and none repeat), then return the result. This runs in $O(N^2)$ time.

Dhruv Rohatgi's code:

#include <iostream>
#include <algorithm>
using namespace std;

int N;
int b[100000], d[100000], ans[100000];
bool used[100000];

int main() {
freopen("photo.in","r",stdin);
freopen("photo.out","w",stdout);
cin >> N;
for(int i=0;i<N-1;i++)
cin >> b[i];
for(int i=2;i<N;i++)
d[i] = b[i-1]-b[i-2];
for(int a=1;a<=N;a++)
{
ans[0] = a, ans[1] = b[0] - a;
for(int i=2;i<N;i++)
ans[i] = ans[i-2] + d[i];
for(int i=1;i<=N;i++)
used[i] = 0;
for(int i=0;i<N;i++)
{
if(used[ans[i]] || ans[i] <= 0 || ans[i] > N)
{
break;
}
used[ans[i]] = 1;
}
{
for(int i=0;i<N;i++)
{
cout << ans[i];
if(i<N-1) cout << ' ';
}
cout << '\n';
return 0;
}
}
}


Bonus: Solve the problem in $O(N).$