Program bird; Const infile = 'bird15.in'; outfile = 'bird.out';//bird2.ans Var i1, max1, n, m, p, i, j, k, x1, y1, z, xx, xxx, Ans : longint; ff : Boolean; f : Array[0..2000, 0..10100] of longint; flag : Array[0..2000, 0..11000] of Boolean; x, y, b, up, drop : Array[0..10000] of longint; Function min(x, y : longint) : longint; Begin If x < y Then exit(x) Else exit(y); End; Begin //Assign(input, infile); // Assign(output, outfile); // Reset(input); // Rewrite(output); Readln(n, m, p); For i :=0 To n - 1 DO Readln(up[i], drop[i]); Fillchar(flag, sizeof(flag), true); For i :=1 To n DO Begin y[i] := 0; x[i] := m + 1; End; For i :=1 To p Do Begin Readln(b[i], x1, y1); x[b[i]] := x1; y[b[i]] := y1; x[b[i]] := m - x[b[i]] + 1; y[b[i]] := m - y[b[i]] + 1; End; For i :=0 To m Do For j :=0 TO n Do f[i, j] := maxlongint - 10000; For i :=1 TO m Do f[i, 0] := 0; For j :=1 To n DO Begin For i :=m DownTo 1 DO Begin If i <= m - up[j - 1] Then Begin x1 := i + up[j - 1]; If x1 <= m Then Begin f[i, j] := min(f[i, j], f[x1, j - 1] + 1); f[i, j] := min(f[i, j], f[x1, j] + 1); End; End; If i = 1 Then Begin If i + up[j - 1] <= m Then For k :=i + up[j - 1] Downto 1 Do Begin f[i, j] := min(f[i, j], f[k, j - 1] + 1); f[i, j] := min(f[i, j], f[k, j] + 1); End; End; End; For i :=y[j] + 1 To x[j] - 1 DO Begin If i - drop[j - 1] > 0 Then f[i, j] := min(f[i, j], f[i - drop[j - 1], j - 1]); End; For i :=0 To y[j] Do Begin // Writeln(i, ' ', j); f[i, j] := maxlongint - 10000; ENd; For i :=x[j] To m DO BEgin // Writeln(i, j); f[i, j] := maxlongint - 10000; ENd; End; { For i :=1 TO m DO Begin For j :=0 TO n Do Write(f[i, j]:11); Writeln; End; } Ans := maxlongint - 10000; For i :=1 TO m DO Begin If flag[i, n] Then If f[i, n] < Ans Then Begin Ans := f[i, n]; // Writeln(i, ' ', Ans); End; End; IF Ans = maxlongint - 10000 Then Writeln(0) Else Begin Writeln(1); Writeln(Ans); End; IF Ans = maxlongint - 10000 Then Begin max1 := 0; For i1 :=1 To p Do Begin ff := true; For i :=1 To m DO If f[i, b[i1]] < maxlongint - 10000 Then Begin Inc(max1); ff := false; Break; End; // If ff Then Writeln(b[i1]); // If ff Then Break; End; Writeln(max1); End; //Close(input); //Close(output); End. /************************************************************** Problem: 2336 User: admin Language: Pascal Result: Wrong Answer ****************************************************************/