#include <stdio.h>
#include <stdlib.h>

#include "utils.h"

void fusion(long* A,size_t p,size_t q,size_t r,struct compte* c){
	size_t n1 = q-p;
	size_t n2 = r-q;
	long* Ag = malloc(n1*sizeof(long));
	long* Ad = malloc(n2*sizeof(long));
	copierTableau(Ag,A+p,n1);
	copierTableau(Ad,A+q,n2);
	c->ecrit += n1+n2;
	size_t indG = 0;
	size_t indD = 0;
	size_t i = p;
	while(comparer(i,"<",r,c)/*i < r*/){
		if(comparer(indG,"==",n1,c)/*indG == n1*/){
			//A[i] = Ad[indD];
			ecrire(A+i,Ad[indD],c);
			indD++;
		}else if(comparer(indD,"==",n2,c)/*indD == n2*/){
			//A[i] = Ag[indG];
			ecrire(A+i,Ag[indG],c);
			indG++;
		}else if(comparer(Ag[indG],"<",Ad[indD],c)/*Ag[indG] < Ad[indD]*/){
			//A[i] = Ag[indG];
			ecrire(A+i,Ag[indG],c);
			indG++;
		}else{
			//A[i] = Ad[indD];
			ecrire(A+i,Ad[indD],c);
			indD++;
		}
		i++;
	}
	free(Ad);
	free(Ag);
}

void sousTriFusion(long* A,size_t p,size_t r,struct compte* c){
	if(/*comparer(p+1,"<",r,c)*/p+1 < r){
		size_t q = (p+r)/2;
		sousTriFusion(A,p,q,c);
		sousTriFusion(A,q,r,c);
		fusion(A,p,q,r,c);
	}
}

void triFusion(long* A,size_t n,struct compte* c){
	sousTriFusion(A,0,n,c);
}

int main(int argc,char** argv){
	long* A = malloc((argc-1)*sizeof(long));
	for(size_t i = 0;i < argc-1;i++){
		A[i] = atol(argv[i+1]);
	}
	struct compte c;
	initCompte(&c);
	printf("Tableau d'entrée: ");
	printTab(A,argc-1);
	triFusion(A,argc-1,&c);
	printf("Tableau de sortie: ");
	printTab(A,argc-1);
	printf("Comparaisons: %lu\nEcritures: %lu\n",c.comp,c.ecrit);
	free(A);
}