program dreams;
const MAXX = 1000;
type elenco=array [1..MAXX] of Longint;
var N, test, i, A, B, id , min, max,count, numeropal:Longint;
pal : elenco;
(*A function to check if n is palindrome*)
function isPalindrome (x:Longint):boolean;
var rev, ricordax:Longint;
(* Find reverse of x*)
begin
rev:= 0; ricordax:=x;
while x>=1 do
begin
rev := rev*10 + x mod 10;
x:= x div 10;
end;
(*If x and rev are same, then x is palindrome*)
if ricordax=rev then isPalindrome:=true
else isPalindrome:=false;
end;
procedure generaPal;
var j:Longint;
begin
j:=1;
for i:=0 to Maxx do
if isPalindrome(i)=true then begin pal[j]:=i; j:=j+1; end;
numeropal:=j-1;
end;
Procedure ricercaLower (var w:elenco; target:longint); (*ritorna indice del valore minore/uguale a target *)
var m,start,eend: longint;
begin
start:=1; eend:=numeropal ; m:=-1;
while start<=eend do
begin
m:=(start + eend) div 2;
if w[m]<=target then begin id:=m; start:=m+1 end
else if w[m]>target then eend:=m-1;
end;
end;
begin
readln(N);
generaPal;
for test:=1 to N do
begin
readln(min, max);
if isPalindrome(min)=true then count:=1 else count:=0;
ricercaLower(pal, min);
A:=id;
ricercaLower(pal, max);
B:=id;
count:=count+B-A;
writeln(count);
end;
end.
cHJvZ3JhbSBkcmVhbXM7CmNvbnN0IE1BWFggPSAxMDAwOwp0eXBlIGVsZW5jbz1hcnJheSBbMS4uTUFYWF0gb2YgTG9uZ2ludDsKdmFyIE4sIHRlc3QsIGksIEEsIEIsIGlkICwgbWluLCBtYXgsY291bnQsIG51bWVyb3BhbDpMb25naW50OwogICAgcGFsIDogZWxlbmNvOwoKKCpBIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIG4gaXMgcGFsaW5kcm9tZSopCgpmdW5jdGlvbiBpc1BhbGluZHJvbWUgKHg6TG9uZ2ludCk6Ym9vbGVhbjsKIHZhciByZXYsIHJpY29yZGF4OkxvbmdpbnQ7CiAgKCogRmluZCByZXZlcnNlIG9mIHgqKQogYmVnaW4KICAgIHJldjo9IDA7IHJpY29yZGF4Oj14OwogICAgd2hpbGUgeD49MSBkbyAKICAgICAgICAgICAgICAgICAgICBiZWdpbiAKICAgICAgICAgICAgICAgICAgICAgICAgcmV2IDo9IHJldioxMCArIHggbW9kIDEwOwogICAgICAgICAgICAgICAgICAgICAgICB4Oj0geCBkaXYgMTA7CiAgICAgICAgICAgICAgICAgICAgZW5kOwogICAgKCpJZiB4IGFuZCByZXYgYXJlIHNhbWUsIHRoZW4geCBpcyBwYWxpbmRyb21lKikKICAgIGlmIHJpY29yZGF4PXJldiB0aGVuIGlzUGFsaW5kcm9tZTo9dHJ1ZQogICAgICAgICAgICAgICAgICAgIGVsc2UgaXNQYWxpbmRyb21lOj1mYWxzZTsKICBlbmQ7CgogCnByb2NlZHVyZSBnZW5lcmFQYWw7CnZhciBqOkxvbmdpbnQ7CmJlZ2luCiAgICAgajo9MTsKICAgICBmb3IgaTo9MCB0byBNYXh4IGRvCiAgICAgICAgICAgICAgIGlmIGlzUGFsaW5kcm9tZShpKT10cnVlIHRoZW4gYmVnaW4gcGFsW2pdOj1pOyBqOj1qKzE7IGVuZDsKICAgICBudW1lcm9wYWw6PWotMTsKZW5kOyAgICAgICAgCgoKUHJvY2VkdXJlIHJpY2VyY2FMb3dlciAodmFyIHc6ZWxlbmNvOyB0YXJnZXQ6bG9uZ2ludCk7ICgqcml0b3JuYSBpbmRpY2UgZGVsIHZhbG9yZSBtaW5vcmUvdWd1YWxlIGEgdGFyZ2V0ICopCiAgdmFyIG0sc3RhcnQsZWVuZDogbG9uZ2ludDsKICAgICAgCiBiZWdpbiAgCiAgICBzdGFydDo9MTsgZWVuZDo9bnVtZXJvcGFsIDsgbTo9LTE7CiAgICB3aGlsZSBzdGFydDw9ZWVuZCBkbwogICAgICAgICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgICAgIG06PShzdGFydCArIGVlbmQpIGRpdiAyOwogICAgICAgICAgICAgICAgICBpZiB3W21dPD10YXJnZXQgdGhlbiBiZWdpbiBpZDo9bTsgIHN0YXJ0Oj1tKzEgZW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlICBpZiB3W21dPnRhcmdldCB0aGVuICAgZWVuZDo9bS0xOyAKICAgICAgICAgICAgICAgICBlbmQ7CiBlbmQ7CgpiZWdpbgoJcmVhZGxuKE4pOwoJZ2VuZXJhUGFsOwoJZm9yIHRlc3Q6PTEgdG8gTiBkbwoJICAgICAgICAgYmVnaW4gICAgICAgICAKCSAgICAgICAgICAgcmVhZGxuKG1pbiwgbWF4KTsKCSAgICAgICAgICAgaWYgaXNQYWxpbmRyb21lKG1pbik9dHJ1ZSB0aGVuIGNvdW50Oj0xIGVsc2UgY291bnQ6PTA7CiAgICAgICAgICAgICAgICAgICByaWNlcmNhTG93ZXIocGFsLCBtaW4pOwogICAgICAgICAgICAgICAgICAgQTo9aWQ7CiAgICAgICAgICAgICAgICAgICByaWNlcmNhTG93ZXIocGFsLCBtYXgpOwogICAgICAgICAgICAgICAgICAgQjo9aWQ7CiAgICAgICAgICAgICAgICAgICBjb3VudDo9Y291bnQrQi1BOwogICAgICAgICAgICAgICAgICAgd3JpdGVsbihjb3VudCk7CiAgICAgICAgICAgICAgICBlbmQ7ICAKZW5kLg==