Problem:
One

Problem Statement

電車の窓から美しい山並みが見える．

窓は，左下隅の座標が (0, 0)，右上隅の座標が (W, H) の長方形である．

窓からは N つの山が見えており，i 番目の山は上に凸な放物線 y = a_i (x-p_i)^2 + q_i の形をしている．

山と空との境界線の長さを求めよ．

次の三つの図は Sample Input に対応している．太線で示されている部分が山と空との境界線である．

Input

入力は以下の形式に従う．与えられる数は全て整数である．

W H N
a_1 p_1 q_1
...
a_N p_N q_N

Constraints

1 ≦ W, H ≦ 100

1 ≦ N ≦ 50

-100 ≦ a_i ≦ -1

0 ≦ p_i ≦ W

1 ≦ q_i ≦ H

i \neq j ならば (a_i, p_i, q_i) \neq (a_j, p_j, q_j)

Output

山と空との境界線の長さを 1 行に出力せよ．

出力する値は，真の値との絶対誤差または相対誤差が 10^{-6} 未満でなければならない．

Sample Input 1

20 20 1
-1 10 10

Output for the Sample Input 1

21.520346288593280

Sample Input 2

20 20 2
-1 10 10
-2 10 5

Output for the Sample Input 2

21.520346288593280

Sample Input 3

15 100 2
-2 5 100
-2 10 100

Output for the Sample Input 3

126.921542730127873

Solution in C (judge verdict: Time Limit Exceeded)

/*
  @kankichi573
*/
#include <stdio.h>
#include <math.h>
#include <float.h>

#define KUKAN 8000000
int W,H,N;
int a[50],p[50],q[50];

double houbutu(double x,int a0,int p0,int q0)
{
        return(a0*(x-p0)*(x-p0)+q0);
}

double value(double x)
{
        int i;
        double max_,ret;

        for(i=0,max_=0;i<N;i++)
        {
                ret=houbutu(x,a[i],p[i],q[i]);
                //printf("ret=%lf (%lf)\n",ret,x); 
                if(max_<ret)
                        max_=ret;
        }
        if(max_>H)
                max_=H;
        if(max_<0)
                max_=0;
        return(max_);
}


main()
{
        double sum,prev_v,next_v,x2,y2,deltax,deltay;
        int i;

        scanf("%d %d %d",&W,&H,&N);
        for(i=0;i<N;i++)
                scanf("%d %d %d",&a[i],&p[i],&q[i]);

        sum=0.0;
        prev_v=value(0.0);
        deltax=(W/(double)KUKAN);

        x2=deltax*deltax;
        for(i=0;i<KUKAN;i++)
        {
                next_v=value((i+1)*deltax);
                //printf("nv=%lf (%lf)\n",next_v,(i+1)*deltax); 
                deltay=next_v-prev_v;
                y2=deltay*deltay;
            
                if(y2>0)
                        sum += (sqrt (x2 + y2));
                prev_v=next_v;
        }
        printf("%lf\n",sum);

  return(0);
}