{ CEOI'98 Penktoji Centrin‚s Europos žali— informatikos olimpiada }
{ Zadar, Kroatija }
{ Pirmas u‘davinys KVADRATAI }

{ Sprendim… pareng‚ Jurgis Pažukonis, VTGTM lic‚jus, 10 kl. }

{ IDJA: Kvadrat… modeliuojame intervalu nuo vieno kampo iki kito (kamp…
 skai‡iuojame tarp y ažies ir ties‚s einan‡ios per koordina‡i— prad‘i… ir
 tažk…, taigi kvadrat… atitinkan‡io intervalo prad‘ia bus kampas kur
 sudaro kvadrato kairysis viržutinis tažkas, o pabaiga - kampas, kur
 sudaro dežinysis apatinis tažkas).

 Taip pat apsiskai‡iuojame atstum… nuo koordian‡i— prad‘ios iki kvadrato.
 Tai bus statmuo iž koordina‡i— prad‘ios  tiesŠ, kuri eina per kairj
 viržutin ir dežinj apatin kvadrato tažkus.

 Imame kvadratus nuo tolimiausio iki ar‡iausio ir ‘ymim‚s matomus intervalus.
 Pa‚mŠ nauj… kvadrat… iž prad‘i— pertvarkome jau buvusius intervalus taip,
 kad visi intervalai b–t— matomi (jei naujas u‘dengia sen…, sen… panaikiname,
 jei naujas visas eina  sen…, senas padalinamas i dvi dalis, jei naujas
 u‘dengia sen… tik iž vienos pus‚s, senas patrumpinamas). Tada ražomas ir
 naujas intervalas.

 Kai pereiname visus kvadratus, suskai‡iuojame, kiek yra interval— atitin-
 kan‡i— skirtingus kvadratus (per‘i–rin‚dami kvadratus, prie kiekvieno
 intervalo pasi‘ymime iž kurio jis kvadrato).  Be to intervalas
 neskai‡iuojamas, jei jo prad‘ia sutampa su pabaiga (nes jame turi buti
 bent du nesutampantys tažkai).

 Interval—, atitinkan‡i— skirtingus kvadratus skai‡ius ir bus lygus
 matom— kvadrat— skai‡iui.  }



program kvadratai;
const maxc = 2000;
type intervalas = record
                    a, b : real;
                    n, at : integer
                  end;

  var m : array [1 .. maxc] of intervalas; { ražomi matomi intervalai }
      d : array [1 .. 1000] of intervalas; { duot— kvadrat— intervalai }
      bv : array [1 .. 1000] of boolean;
            { spausdinant rezultatus, kurie kvadratai jau buvo atspausdinti }
      i : intervalas;
      f : text;
      max, n, ck, c, x, y, l, at, rez : integer;
      a, b : real;

function laisvas : integer;
      { randa pirm… laisv… interval… masyve m
        (laisvas - ka‘kada buvo ražytas, o po to ižtrintas).
        tai žiokia tokia optimizacija.
        jei laisvo nerandame, imame nauj… element… }
  var c : integer;
begin
  c := 1;
  while m[c].at > 0 do inc (c);
  if c > max then max := c;
  laisvas := c
end;

begin
  assign (f, 'squares.in'); reset (f);
  for c := 1 to max do m[c].at := 0;
  max := 0;
  readln (f, n);
  for c := 1 to n do  { skaitome pradinius duomenis }
    begin
      readln (f, x, y, l);
      d[c].at := x+y+l; d[c].n := c; { apskai‡iuojame kvadrat… atitinkant
                                       interval… }
      d[c].a := arctan(x/(y+l)); d[c].b := arctan((x+l)/y);
    end;
  close (f);

  c := 1;
  while c < n do   { surikiuojame kvadratus pagal atstum… ma‘‚jimo tvarka }
    if d[c].at >= d[c+1].at then inc (c)
       else begin
              i := d[c]; d[c] := d[c+1]; d[c+1] := i;
              if c = 1 then inc (c)
                       else dec (c)
            end;

  max := 0;
  for ck := 1 to n do { imame visus iž eil‚s kvadratus }
   begin
     for c := 1 to max do   { u‘dengiame buvusius intervalus }
       if m[c].at > 0 then
         if (d[ck].a <= m[c].a) and (d[ck].b >= m[c].b) then m[c].at := 0
            else if (d[ck].a > m[c].a) and (d[ck].b < m[c].b) then
                  begin x := laisvas; m[x] := m[c];
                        m[x].a := d[ck].b; m[c].b := d[ck].a; end
            else if (d[ck].a <= m[c].a) and (d[ck].b > m[c].a) and
                    (d[ck].b < m[c].b) then m[c].a := d[ck].b
            else if (d[ck].b >= m[c].b) and (d[ck].a < m[c].b) and
                    (d[ck].a > m[c].a) then m[c].b := d[ck].a;
     m[laisvas] := d[ck];   { ražome nauj… interval… }
   end;

  fillchar (bv, sizeof(bv), false);  { atspausdiname rezultatus }
  rez := 0;
  for c := 1 to max do
    if (m[c].at > 0) and (m[c].a < m[c].b) and (not bv[m[c].n])
       then begin inc (rez); bv[m[c].n] := true end;
  assign (f, 'squares.out'); rewrite (f);
  writeln (f, rez);
  close (f);
end.