abstract class Seilfly {
    private final String ID;
    private final int GLIDETALL;
    private final int VINGESPENN;
    Seilfly neste = null;
    Seilfly forrige = null;

    public Seilfly(String id, int g, int v) {
        ID = id;
        GLIDETALL = g;
        VINGESPENN = v;
    }

    public String hentId() {
        return ID;
    }

    public int hentGlidetall() {
        return GLIDETALL;
    }

    public int hentVingespenn() {
        return VINGESPENN;
    }
}

public class EkteSeilfly extends Seilfly {
    public EkteSeilfly(String id, int g, int v) {
        super(id, g, v);
    }
}

interface Motordrevet {
    int trekkraft();
    String motortype();
}

abstract class MotorSeilfly extends Seilfly implements Motordrevet {
    private final int TREKKRAFT;
    private final String MOTORTYPE;

    public MotorSeilfly(String id, int g, int v, int t, String m) {
        super(id, g, v);
        TREKKRAFT = t;
        MOTORTYPE = m;
    }

    @Override
    public int trekkraft() {
        return TREKKRAFT;
    }

    @Override
    public String motortype() {
        return MOTORTYPE;
    }
} 

public class TMG extends MotorSeilfly {
    public TMG(String id, int g, int v, int t, String m) {
        super(id, g, v, t, m);
    }
}

public class SLG extends MotorSeilfly {
    public SLG(String id, int g, int v, int t, String m) {
        super(id, g, v, t, m);
    }
}

public class SSG extends MotorSeilfly {
    public SSG(String id, int g, int v, int t, String m) {
        super(id, g, v, t, m);
    }
}

public class Konkurransegruppe implements Iterable<Seilfly> {
    private Seilfly f?rste = null;
    private Seilfly siste = null;

    public Konkurransegruppe() {

    }

    public void leggTil(Seilfly ny) {
        if (f?rste == null) {
            f?rste = ny;
            siste = ny;
            return;
        }

        siste.neste = ny;
        ny.forrige = siste;
        siste = ny;
    }

    public boolean erMed(String ?nsketID) {
        Seilfly peker = f?rste;

        while (peker != null) {
            if (peker.hentID().equals(?nsketID)) {
                return true;
            }
            peker = peker.neste;
        }

        return false;
    }

    public Seilfly taUt(String ?nsketID) {
        if (!erMed(?nsketID)) {
            return null;
        }

        Seilfly peker = f?rste;
        while (!peker.hentID().equals(?nsketID)) {
            peker = peker.neste;
        }

        if (f?rste == siste) {
            f?rste = siste = null;
            return peker;
        }

        if (peker == f?rste) {
            f?rste = peker.neste;
            f?rste.forrige = null;
            return peker;
        }

        if (peker == siste) {
            siste = peker.forrige;
            siste.neste = null;
            return peker
        }

        peker.forrige.neste = peker.neste;
        peker.neste.forrige = peker.forrige;
        return peker;
    }

    private class SeilflyIterator implements Iterator<Seilfly> {
        Seilfly peker = f?rste;

        @Override
        public boolean hasNext() {
            return peker != null;
        }

        @Override 
        public Seilfly next() {
            Seilfly midlertidig = peker;
            peker = peker.neste;
            return midlertidig;
        }
    }

    @Override
    public SeilflyIterator iterator() {
        return new SeilflyIterator();
    }

    public Seilfly[] hentEkteSeilfly() {
        int teller = 0;
        for (Seilfly s : this) {
            if (s instanceof EkteSeilfly) {
                teller++;
            }
        }

        Seilfly[] alleEkteSeilfly = new Seilfly[teller];
        int i = 0;

        for (Seilfly s : this) {
            if (s instanceof EkteSeilfly) {
                alleEkteSeilfly[i] = s;
                i++;
            }
        }

        return alleEkteSeilfly;
    }

    public int besteGlidetall() {
        if (f?rste == null) {
            // ANTAR AT METODEN SKAL RETURNERE 0, SIDEN METODEN RETURNERER ET HELTALL, IKKE ET OBJEKT
            return 0;
        }

        int h?yest = f?rste.hentGlidetall();

        for (Seilfly s : this) {
            if (s.hentGlidetall() > h?yest) {
                h?yest = s.hentGlidetall();
            }
        }
        return h?yest;
    }

    public int st?rstSpennviddeHjelp(Seilfly fly, int h?yest) {
        if (fly == null) {
            return h?yest;
        }

        if (fly.hentVingespenn() > h?yest) {
            h?yest = fly.hentVingespenn();
        }

        return st?rstSpennviddeHjelp(fly.neste, h?yest);
    }

    public int st?rstSpennvidde() {
        if (f?rste == null) {
            // ANTAR AT METODEN SKAL RETURNERE 0, SIDEN METODEN RETURNERER ET HELTALL, IKKE ET OBJEKT
            return 0;
        }
        return st?rstSpennviddeHjelp(f?rste, f?rste.hentVingespenn());
    }

    public int[] histogramSpennvidde() {
        int[] histogram = new int[99];

        for (Seilfly fly : this) {
            int spenn = fly.hentVingespenn();
            if (spenn >= 10 && spenn <= 99) {
                histogram[spenn] = histogram[spenn]++;
            }
        }

        return histogram;
    }
}