class TriFusion extends ProblemeDPR<Integer[]> {
    Integer[] elems;

    TriFusion( Integer[] aTrier ) {
	elems = aTrier;
    }

    public boolean estSimple() {
	return( elems.length == 1 );
    }

    public Integer[] resoudreSimple() {
	return( elems );
    }

    public TriFusion[] decomposer() {
	int mid = elems.length/2;
	
	Integer[] gauche = new Integer[mid];
	for ( int i = 0; i < mid; i++ ) {
	    gauche[i] = elems[i];
	}
	Integer[] droite = new Integer[mid];
	for ( int i = 0; i < mid; i++ ) {
	    droite[i] = elems[i+mid];
	}
	return( new TriFusion[]{ new TriFusion(gauche), new TriFusion(droite) } );
    }
    
    public Integer[] combiner( ProblemeDPR<Integer[]>[] s ) {
	Integer[] res = new Integer[s[0].solution().length + s[1].solution().length];
	int i1 = 0, i2 = 0, i = 0;
	while ( i1 < s[0].solution().length && i2 < s[1].solution().length ) {
	    if ( s[0].solution()[i1] < s[1].solution()[i2] ) {
		res[i++] = s[0].solution()[i1++];
	    } else {
		res[i++] = s[1].solution()[i2++];
	    }
	}
	for (int j = i1; j < s[0].solution().length; j++ ) {
	    res[i++] = s[0].solution()[j];
	}
	for (int j = i2; j < s[1].solution().length; j++ ) {
	    res[i++] = s[1].solution()[j];
	}
	return( res );
    }


    public static void main(String[] args) {
	if (args.length == 0) {
	    System.out.println( "Usage:" );
	    System.out.println( "  java TriFusion n" );
	    System.exit(1);
	}
	
	int nbElems = Integer.parseInt(args[0]);
	Integer[] vals = new Integer[nbElems];
	for ( int i = 0; i < nbElems; i++ ) {
	    vals[i] = 100 - i;
	}
	TriFusion f = new TriFusion( vals );
	f.resoudre();
	for ( int i = 0; i < nbElems; i++ ) {
	    System.out.println( f.solution()[i] );
	}
    }
}
    
