

/**********************************************************************/
/*                                                                    */ 
/*                        TD 1, Exercice 3                            */
/*                                                                    */
/**********************************************************************/


import java.util.* ;

public class UnEntier {
    int val;
    
    public UnEntier (int x) {
	val = x;
    }
    
    public int intValue() {
	return val;
    }
    
    public void setValue(int x) {
	val = x; 
    }
}


public class SommePartielle extends Thread {

    int pos,i;
    int t[][];
    
    SommePartielle(int position,int tab[][]) {
	pos = position;
        t=tab;
    }

    int pow(int a,int b) {
	int ctr,r ;
        r=1;
	for (ctr=1;ctr<=b;ctr++) {
	    r = r * a;
	};
        return r ;
    };
            
    public void run() {
        int i,j;
        
        for (i=1;i<=3;i++) {
	    j = pos-pow(2,i-1);
            if (j>=0) { 
                while (t[j][i-1]==0) {} ; // attendre que le resultat soit pret
		t[pos][i] = t[pos][i-1]+t[j][i-1] ; 
	    } else {
		t[pos][i] = t[pos][i-1] ;
	    };
	};
    }
}

public class Exo3 {

    public static void main(String[] args) {
	int[][] tableau = new int[8][4];
        int i,j;
        Random r = new Random();
        
        for (i=0;i<8;i++) {
            tableau[i][0] =  r.nextInt(8)+1 ;
	    for (j=1;j<4;j++) {
		tableau[i][j]=0;
	    };
	};
        
        for (i=0;i<8;i++) {
            new SommePartielle(i,tableau).start() ;
	};
                
        for (i=0;i<8;i++) {
           while (tableau[i][3]==0) {} ;
	};
        
        for (i=0;i<4;i++) {
            System.out.print("\n");
       	    for (j=0;j<8;j++) {
		System.out.print(tableau[j][i]+" ");
	    };
	};        
        System.out.print("\n");
        
    }
}
        
            
	
            
