from itertools import *
from bisect import *
#from math import *
from collections import *
from heapq import *
from random import *
from decimal import *
import numpy as np
import sys

sys.setrecursionlimit(10 ** 6)
int1 = lambda x: int(x) - 1
p2D = lambda x: print(*x, sep="\n")
def II(): return int(sys.stdin.readline())
def MI(): return map(int, sys.stdin.readline().split())
def MI1(): return map(int1, sys.stdin.readline().split())
def MF(): return map(float, sys.stdin.readline().split())
def LI(): return list(map(int, sys.stdin.readline().split()))
def LI1(): return list(map(int1, sys.stdin.readline().split()))
def LF(): return list(map(float, sys.stdin.readline().split()))
def LLI(rows_number): return [LI() for _ in range(rows_number)]
dij = [(1, 0), (0, 1), (-1, 0), (0, -1)]

def main():
    def issym(a):
        s=str(a)
        if s==s[::-1]:
            return True
        return False

    s=input()
    n=int(s)
    if n<10**9+1:
        print(0)
        exit()
    k=len(s)-9
    ans=0
    for i in range(1,k):
        ans+=10**((i+1)//2)-1
    for x in range(10**(k-1),10**k):
        a=x*1000000001
        if a>n:break
        if issym(a):ans+=1
    print(ans)

main()