
import java.util.*;

class TrendChecker
{
    private double weight;
    private double limit;
    private int offset;

    TrendChecker (double weight, double limit)
    {
        this.weight = weight;
        this.limit = limit;
        offset = 10;
    }

    boolean check (List<Integer> values, boolean print)
    {
        // Skip initial undefined values

        int start = 0;

        while (start < values.size () && values.get (start) < 0)
            start++;
        if (start == values.size ())
            return true;
        values = values.subList (start, values.size ());

        double p = Math.log (values.get (0) + offset);
        double s = 0.0;
        double d = 1.0;
        double e = 0.0;

        // System.out.print ("     " + p);

        for (int val : values)
        {
            double v = Math.log (val + offset);
            // System.out.print (" " + v);
            e = (double) v - p;
            d = (1 - weight) * d + weight * Math.abs (e);
            s = (1 - weight) * s + weight * (v - (p - s));
            p = p + s;
            if (print)
            {
                System.out.printf ("   v %6.3f", v);
                System.out.printf ("   e %6.3f", e);
                System.out.printf ("   d %6.3f", d);
                System.out.printf ("   s %6.3f", s);
                System.out.printf ("   p %6.3f", p);
                System.out.println ();
            }
        }

/*
        System.out.println ();
        System.out.println ("      p " + p);
        System.out.println ("      s " + s);
        System.out.println ("      d " + d);
        System.out.println ("      e " + e);
*/

        return Math.abs (e) <= limit * d;
    }
}

