{ 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. }

{ IDJA: 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 kairj
 virutin ir deinj 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.