Anton goes to school, his favorite lessons are arraystudying. He usually solves all the tasks pretty fast, but this time the teacher gave him a complicated one: given two arrays b and c of length n, find array a, such that:
where a and b means bitwise AND, while a or b means bitwise OR.
Usually Anton is good in arraystudying, but this problem is too hard, so Anton asks you to help.
The first line of the input contains a single integers n (1 ≤ n ≤ 200 000) — the size of arrays b and c.
The second line contains n integers bi (0 ≤ bi ≤ 109) — elements of the array b.
Third line contains n integers ci (0 ≤ ci ≤ 109) — elements of the array c.
If there is no solution, print - 1.
Otherwise, the only line of the output should contain n non-negative integers ai — elements of the array a. If there are multiple possible solutions, you may print any of them.
4 6 8 4 4 16 22 10 10
3 5 1 1
5 8 25 14 7 16 19 6 9 4 25
-1
#include<stdio.h>
long long b[200005],c[200005],a[200005];
long long sm[90];
int main()
{
int n;
scanf("%d",&n);
long long sum=0;
for(int i=1;i<=n;i++){
scanf("%lld",&b[i]);
sum+=b[i];
}
for(int i=1;i<=n;i++){
scanf("%lld",&c[i]);
sum+=c[i];
}
int f=0;
int mx=0;
//long long add=0;
if(sum%(2*n)==0){
sum/=2*n;
f=1;
for(int i=1;i<=n;i++){
if((b[i]+c[i]-sum)%n!=0){
f=0;
break;
}
a[i]=(b[i]+c[i]-sum)/n;
int step=0;
long long xx=a[i];
while(xx){
if(xx&1){
sm[step]++;
}
step++;
xx>>=1;
}
if(mx<step)mx=step;
}
}
//printf("--\n");
if(f){
long long aa,bb,cc;
int step=0;
long long one=1;
for(int i=1;i<=n;i++){
aa=a[i];
bb=cc=step=0;
while(aa||step<mx){
if(aa&1){
bb+=(one<<step)*sm[step];
cc+=(one<<step)*n;
}
else cc+=(one<<step)*sm[step];
aa>>=1;
step++;
}
if(bb!=b[i]||cc!=c[i])f=0;
}
}
if(f){
for(int i=1;i<=n;i++){
printf("%d ",a[i]);
}
printf("\n");
}
else printf("-1\n");
return 0;
}