return a==b ? (a==c ? d : c) : (a==c ? b : a);
int X[4];
return X[(X[0]==X[2])+2*(X[0]==X[1])];
int f(int p,int q,int r){
return p==r ? q : p;
}
int g(int a,int b,int c,int d){
return a==b ? f(c,d,a) : f(a,b,c);
}
int x=a^b,y=a^c;
x=(x|-x)>>31; y=(y|-y)>>31;
return ((a^b^c^d)&x&y)^((b^d)&x)^((c^d)&y)^d;
static void Main(string[] args) {
int[] dat=Array.ConvertAll(Console.ReadLine().Split(' '),int.Parse);
int S=0;
foreach(int x in dat) S+=x;
if(S%3!=0) {
Console.WriteLine("-1"); return;
}
S/=3;
int[,] M=new int[S+1,S+1];
M[0,0]=-1;
foreach(int x in dat) {
for(int a=S;a>=0;a--) {
for(int b=S;b>=0;b--) {
if(M[a,b]==0) {
if(a>=x && M[a-x,b]!=0) M[a,b]=x; // back by set1
else if(b>=x && M[a,b-x]!=0) M[a,b]=-x; // back by set2
}
}
}
}
if(M[S,S]==0) {
Console.WriteLine("-1"); return;
}
int u=S,v=S;
string res1="",res2="";
while(u!=0 || v!=0) {
if(M[u,v]>0) {
res1+=" "+M[u,v]; u-=M[u,v];
} else {
res2+=" "+(-M[u,v]); v+=M[u,v];
}
}
Console.WriteLine(res1);
Console.WriteLine(res2);
}
static int pres,qres;
static int[] A;
static int M=10;
bool Find1(int p,int q){
if(A[q]-A[p]==M){
pres=p; qres=q;
return true;
}
if(A[q]-A[p]<M || q-p<2) return false;
int k=p+(q-p)/2;
if(Find1(p,k) || Find1(k,q)) return true;
return Find2(p,k,k+1,q);
}
bool Find2(int p1,int q1,int p2,int q2){ // p1<=q1<p2<=q2
if(A[p2]-A[q1]>M || A[q2]-A[p1]<M) return false;
if(A[p2]-A[p1]==M){
pres=p1; qres=p2; return true;
}
if(A[p1]==A[q1] && A[p2]==A[q2]) return false;
if(A[q1]-A[p1]>A[q2]-A[p2]){
int k=p1+(q1-p1)/2;
return Find2(p1,k,p2,q2) || Find2(k+1,q1,p2,q2);
}else{
int k=p2+(q2-p2)/2;
return Find2(p1,q1,p2,k) || Find2(p1,q1,k+1,q2);
}
}
Нужно многоугольник делить делителями. Координаты делителей относительные. Например это может быть процент или расстояние от первой точки многоугольника. Пока это неважно.
p1*(0.1967-1) + p2*0.4561 + p3*0.3321 + p4*0.2982 = 0
p1*0.0750 + p2*(0.0553-1) + p3*0.1986 + p4*0.0325 = 0
p1*0.2239 + p2*0.4863 + p3*(0.0291-1) + p4*0.3382 = 0
p1*1+p2*1+p3*1+p4*1=1