#include <iostream.h>
#include <fstream.h>
#include <ilcplex/ilocplex.h>

int main(int argc, char **argv)
{
    if (argc < 1)
    {
    	cout << "Vous devez specifier le fichier source\n";
	return -1;
    }
    
    char *infile=argv[1], *outfile=argv[2];
    int nb_tache;
    int succ;
    int i,j;
    int nb_succ;
    int *duree;
    
    // ouverture du stream en lecture
    ifstream f(infile);
    
    if (!f)
    {
        cout << "Erreur d'ouverture du fichier\n";
        return -1;
    }
    else
    {
	IloEnv env;
	IloModel model(env);
    	
        f >> nb_tache;
        duree = new int[nb_tache+1];

    	IloNumVarArray debut(env, nb_tache+1, 0, IloInfinity, ILOINT);
		
	for (i=1; i <= nb_tache; i++) f>>duree[i];
	
        int numero_tache;

        while (!f.eof())
        {
                f >> numero_tache >> nb_succ;

                for (i=0; i < nb_succ; i++)
                {
                    f >> succ;
		    model.add(debut[succ] >= debut[numero_tache] + duree[numero_tache]);
                }
         }
	
	 IloNumVar fin(env, 0, IloInfinity, ILOINT);
    
	for (i=1; i <= nb_tache; i++) model.add(fin >= debut[i] + duree[i]);
	
	model.add(IloMinimize(env, fin));
	IloCplex cplex(env);
	cplex.extract(model);
	if (cplex.solve())
	{
		cout << "OK !" << endl;
    		cout << cplex.getValue(fin) << endl;
	}
    }
    
    // on ferme le stream
    f.close();
    
    return 0;
}
