Problem:
Score : 200 points

Problem Statement

Given is an integer N. Find the number of positive integers less than or equal to N that have an odd number of digits (in base ten without leading zeros).

Constraints

1 \leq N \leq 10^5

Input

Input is given from Standard Input in the following format:

N

Output

Print the number of positive integers less than or equal to N that have an odd number of digits.

Sample Input 1

11

Sample Output 1

9

Among the positive integers less than or equal to 11, nine integers have an odd number of digits: 1, 2, \ldots, 9.

Sample Input 2

136

Sample Output 2

46

In addition to 1, 2, \ldots, 9, another 37 integers also have an odd number of digits: 100, 101, \ldots, 136.

Sample Input 3

100000

Sample Output 3

90909

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Numerics;

namespace AtcoderC
{
    class Program
    {
        /*static void Main(string[] args)
        {
        }*/
        //ABC132C
        //全探索法
        /*static void Main()
        {
            BigInteger N = int.Parse(Console.ReadLine());
            int[] input = Console.ReadLine().Split().Select(int.Parse).ToArray();
            int min = input.Min();
            int max = input.Max();
            int countARC = 0;
            int countABC = 0;
            int Answer = 0;
            for (int i = min; i <= max; i++)
            {
                countABC = 0;
                countARC = 0;
                foreach (int n in input)
                {
                    if (n > i)
                    {
                        countARC++;
                    }
                    else
                    {
                        countABC++;
                    }
                }
                if (countABC == countARC)
                {
                    Answer++;
                }
            }
            Console.WriteLine(Answer);
        }*/
        //2回目
        /*static void Main()
        {
            int N = int.Parse(Console.ReadLine());
            int[] input = Console.ReadLine().Split().Select(int.Parse).ToArray();
            Array.Sort(input);
            int min = input[(N / 2) - 1];
            int max = input[N / 2];
            Console.WriteLine(max - min);
        }*/

        //ABC131C
        //ユーグリッドの互除法の応用
        /*static void Main()
        {
            BigInteger[] input = Console.ReadLine().Split().Select(BigInteger.Parse).ToArray();
            BigInteger A = input[0];
            BigInteger B = input[1];
            BigInteger C = input[2];
            BigInteger D = input[3];
            BigInteger ans = (B / C) + (B / D);           
            //最小公倍数
            var ans2 = C * D / lcm(C, D);
            BigInteger ans3 = B / ans2;
            var BB = B - ans + ans3;
            ans = (A - 1) / C + (A - 1) / D;
            ans3 = (A - 1) / ans2;
            var AA = (A - 1) - ans + ans3;
            Console.WriteLine(BB - AA);
            
        }
        static public BigInteger lcm(BigInteger a, BigInteger b)
        {
            var r = a % b;
            while (r != 0)
            {
                a = b;
                b = r;
                r = a % b;
            }
            return b;
        }*/

        //129C
        //動的計画法
        //TLEになる時間がかかり過ぎる
        /*static void Main()
        {
            int[] input = Console.ReadLine().Split().Select(int.Parse).ToArray();
            int N = input[0];
            int M = input[1];
            List<int> ttt = new List<int>();
            for (int i = 0;i < M;i++)
            {
                var temp = int.Parse(Console.ReadLine());
                ttt.Add(temp);
            }
            int[] dparray = new int[N+2];
            dparray[N] = 1;
            dparray[N - 1] = 1;
            for (int i = N-1; i >= 0; i--)
            {
                if (ttt.Contains(i))
                {
                    dparray[i] = 0;
                }
                dparray[i] = (dparray[i + 1] + dparray[i + 2]) % 1000000007;
            }
            Console.WriteLine(dparray[0]);
        }*/
        //ABC128
        /*static void Main()
        {

        }*/
        //ABC134A
        /*static void Main()
        {
            int r = int.Parse(Console.ReadLine());
            var ans = 3 * r * r;
            Console.WriteLine(ans);
        }*/
        //ABC134B
        /*static void Main()
        {
            int[] input = Console.ReadLine().Split().Select(int.Parse).ToArray();
            int N = input[0];
            int D = input[1];
            int count = 0;
            int ans = N;
            while (true)
            {
                ans = ans - (D * 2 + 1);
                count++;
                if (ans <= 0)
                {
                    break;
                }
            }
            Console.WriteLine(count);
        }*/
        //ABC134C
        /*static void Main()
        {
            int N = int.Parse(Console.ReadLine());
            List<int> array = new List<int>();
            for (int i =0;i<N; i++)
            {
                array.Add(int.Parse(Console.ReadLine()));
            }
            List<int> ans = new List<int>();
            int max = array.Max();
            var temp  = new List<int>();
            foreach (int n in array)
            {
                 temp.Add(n);
            }
            temp.Sort();
            temp.Reverse();
            int second = temp[1];

            foreach (int nn in array)
            {
                if (nn == max)
                {
                    Console.WriteLine(second);
                }
                else
                {
                    Console.WriteLine(max);
                }
            }
        }*/
        //134ABCD
        /*static void Main()
        {
            int N = int.Parse(Console.ReadLine());
            int count = 0;
            int ans = 0;
            int[] input = Console.ReadLine().Split().Select(int.Parse).ToArray();
            for (int i = 0;i<N;i++)
            {
                for (int j =0;j<N; j++)
                {
                    if ((j+1)%(i+1)==0)
                    {
                        count += input[j];
                    }
                }
                if (count % 2 == input[i])
                {
                    ans++;
                }
                count = 0;
            }
            if (ans != 0)
            {

            }
        }*/
        //AGC036
        /*static void Main()
        {
            long S = long.Parse(Console.ReadLine());
            long X1 = 1000000000;
            long Y1 = 0;
            /*while (true)
            {
                Y1 = S / X1 + S % X1;
            }
            Y1 = S / X1 + S % X1;
            Console.WriteLine("0 0 " + X1 + " 0 0 " + Y1); 
            /*int tempX = 0;
            List<long> ss = new List<long>();
            while (tempX < S)
            {
                var ans = S % tempX;
                if (ans == 0)
                {
                    ss.Add(ans);
                }
                tempX++;
            }
            Console.WriteLine(tempX);*/
        /*long X1 = 0;
        long Y1 = 1;
        while (true)
        {
            X1 = S % Y1;
            if (X1 <= 1000000000)
            {
                break;
            }
            Y1++;
        }
        Console.WriteLine("0 0 "+X1+" 0 0 "+Y1);
    }*/
        //ABC82A
        /*static void Main()
        {
            double[] input = Console.ReadLine().Split().Select(double.Parse).ToArray();
            double a = input[0];
            double b = input[1];
            double sum = (a + b) / 2;
            Console.WriteLine(Math.Ceiling(sum));

        }*/
        //ABC128C
        /*static void Main()
        {
            int[] input = Console.ReadLine().Split().Select(int.Parse).ToArray();
            int N = input[0];
            int M = input[1];
            int ans = 0;
            List<int[]> K = new List<int[]>();
            for (int i = 0;i<M;i++)
            {
                var temp = Console.ReadLine().Split().Select(int.Parse).ToArray();
                K.Add(temp);
            }
            int[] P = Console.ReadLine().Split().Select(int.Parse).ToArray();
            int[] light = new int[M];
            for (int i = 0;i < Math.Pow(2,N);i++)
            {
                var isrow = 0;
                var temp = int.Parse(Convert.ToString(i, 2)).ToString("0000000000");
                for (int j  =0;j < M;j++)
                {
                    var ison = 0;
                    for (int k = 0; k < K[j][0];k++)
                    {
                        var index = K[j][k] - 1;
                        if (temp[9-index] == '1')
                        {
                            ison++;
                        }
                    }
                    if (ison % 2 == P[j])
                    {
                        isrow++;
                    }
                    else
                    {
                        break;
                    }
                }
                if (isrow == M)
                {
                    ans++;
                }
            }
            Console.WriteLine(ans);*/
        /*nt[] input = Console.ReadLine().Split().Select(int.Parse).ToArray();
        int a = input[0];
        int b = input[1];
        var temp = a * b % 2;
        if (temp == 0)
        {
            Console.WriteLine("even");
        }
        else
        {
            Console.WriteLine("odd");
        }
    }*/
        //ABC127C 
        /*static void Main()
        {
            int[] input = Console.ReadLine().Split().Select(int.Parse).ToArray();
            int N = input[0];
            int M = input[1];
            List<int[]> gate = new List<int[]>();
            for (int i = 0; i < M; i++)
            {
                var temp = Console.ReadLine().Split().Select(int.Parse).ToArray();
                gate.Add(temp);
            }
            if (M == 1)
            {
                Console.WriteLine(N);

            }
            else
            {
                List<int> card = new List<int>();
                for (int i = gate[0][0]; i <= gate[0][1]; i++)
                {
                    card.Add(i);
                }

                for (int j = 1; j < gate.Count; j++)
                {
                    List<int> ans = new List<int>();
                    var count = 0;
                    for (int i = gate[j][0]; i <= gate[j][1]; i++)
                    {
                        if (card.Contains(i))
                        {
                            count++;
                            ans.Add(i);
                        }
                    }
                    if (count == 0)
                    {
                        break;
                    }
                    card = new List<int>(ans);
                }
                Console.WriteLine(card.Count());
            }
        }*/
        //127C Revenge TLE
        /*static void Main()
        {
            int[] input = Console.ReadLine().Split().Select(int.Parse).ToArray();
            int N = input[0];
            int M = input[1];
            List<int[]> gate = new List<int[]>();
            for (int i = 0; i < M; i++)
            {
                var temp = Console.ReadLine().Split().Select(int.Parse).ToArray();
                gate.Add(temp);
            }
            int Ans = 0;
            for (int i =1;i<=N;i++)
            {
                var count = 0;
                for (int j = 0;j < gate.Count;j++)
                {
                    if (gate[j][0] <= i && i <= gate[j][1])
                    {
                        count++;
                    }  
                }
                if (count == gate.Count)
                {
                    Ans++;
                }
            }
            Console.WriteLine(Ans);
        }*/
        //127C RevengeVer2
        /*static void Main()
        {
            int[] input = Console.ReadLine().Split().Select(int.Parse).ToArray();
            int N = input[0];
            int M = input[1];
            List<int[]> gate = new List<int[]>();
            for (int i = 0; i < M; i++)
            {
                var temp = Console.ReadLine().Split().Select(int.Parse).ToArray();
                gate.Add(temp);
            }
            List<int> Max = new List<int>();
            List<int> Min = new List<int>();
            for (int i =0;i< M;i++)
            {
                Max.Add(gate[i][1]);
                Min.Add(gate[i][0]);
            }
            int max = Max.Min();
            int min  = Min.Max();
            if (min <= max)
            {
                Console.WriteLine(max - min + 1);
            }
            else
            {
                Console.WriteLine("0");
            }
        }*/
        //ABC126C
        /*static void Main()
        {
            int[] input = Console.ReadLine().Split().Select(int.Parse).ToArray();
            int N = input[0];
            int M = input[1];
            double ans = 0.0;
            for (int i = 1; i<= N;i++)
            {
                double tempP = (double)1 / N;
                int point = i;
                while (point<M)
                {
                    tempP = tempP * 1 / 2;
                    point *= 2;
                }
                ans += tempP;
            }
            Console.WriteLine(ans);
        }*/
        //ABC125C ユーグリッド互除法
        /*static void Main()
        {
            int N = int.Parse(Console.ReadLine());
            int[] A = Console.ReadLine().Split().Select(int.Parse).ToArray();
            Array.Sort(A);
            int lcmr, lcml = 0;
            List<int> answer = new List<int>();
            for (int i =0;i<A.Length;i++)
            {
                lcmr = 0;
                for (int x = 0;x < i;x++)
                {
                    if (lcmr - A[x] >= 0)
                    {
                        lcmr = lcm(lcmr, A[x]);
                    }
                    else
                    {
                        lcmr = lcm(A[x], lcmr);
                    }
                }
                lcml = 0;
                for (int y = i+1; y < A.Length; y++)
                {
                    if (lcml - A[y] >= 0)
                    {
                        lcml = lcm(lcml, A[y]);
                    }
                    else
                    {
                        lcml = lcm(A[y],lcml);
                    }
                }
                var tempans = 0;
                if (lcmr > lcml)
                {
                   tempans = lcm(lcmr, lcml);
                }
                else
                {
                   tempans = lcm(lcml, lcmr);
                }
                answer.Add(tempans);
            }
            Console.WriteLine(answer.Max());
        }
        static public int lcm(int a, int b)
        {
            if (b == 0)
            {
                return a;
            }
            var r = a % b;
            while (r != 0)
            {
                a = b;
                b = r;
                r = a % b;
            }
            return b;
        }*/

        //124C
        /*static void Main()
        {
            string inputstr = Console.ReadLine();
            int count = 0;
            if (inputstr[0] == '0')
            {
                for (int i = 0; i < inputstr.Length; i++)
                {
                    if (i % 2 == 0)
                    {
                        if (inputstr[i] == '1')
                        {
                            count++;
                        }
                    }
                    else
                    {
                        if (inputstr[i] == '0')
                        {
                            count++;
                        }
                    }
                }
            }
            else
            {
                for (int i = 0; i < inputstr.Length; i++)
                {
                    if (i % 2 == 1)
                    {
                        if (inputstr[i] == '1')
                        {
                            count++;
                        }
                    }
                    else
                    {
                        if (inputstr[i] == '0')
                        {
                            count++;
                        }
                    }
                }
            }
            Console.WriteLine(count);
        }*/
        //123C 
        /*static void Main()
        {
            double N = double.Parse(Console.ReadLine());
            List<double> city = new List<double>();
            for (int i = 0; i < 5; i++)
            {
                city.Add(double.Parse(Console.ReadLine()));
            }
            var ans = Math.Ceiling(N / city.Min()) + 4;
            Console.WriteLine(ans);
        }*/
        //82C
        /*static void Main()
        {
            double[] input = Console.ReadLine().Split().Select(double.Parse).ToArray();
            double a = input[0];
            double b = input[1];
            double answer = (a + b) / 2;
            Console.WriteLine(Math.Ceiling(answer));
        }*/
        //128B
        /*static void Main()
        {
            int[] input = Console.ReadLine().Split().Select(int.Parse).ToArray();
            int A = input[0];
            int P = input[1];
            var ans = (P + A * 3) / 2;
            Console.WriteLine(ans);
            int a,b
            cin << a << b;
            cout >> (P + A * 3) / 2 >> endl;
        }*/
        //119A
        /*static void Main()
        {
            int[] input = Console.ReadLine().Split().Select(int.Parse).ToArray();
            int A = input[0];
            int B = input[1];
            if (B % A == 0)
            {
                Console.WriteLine(A + B);
            }
            else
            {
                Console.WriteLine(B-A);
            }
        }*/
        //116A
        /*static void Main()
        {
            int[] input = Console.ReadLine().Split().Select(int.Parse).ToArray();
            int A = input[0];
            int B = input[1];
            int C = input[2];
            Console.WriteLine((A*B)/2);
        }*/
        //ABC31B
        /*static void Main()
        {
            int[] input = Console.ReadLine().Split().Select(int.Parse).ToArray();
            int N = int.Parse(Console.ReadLine());
            List<int> array = new List<int>();
            for (int i =0;i<N;i++)
            {
                array.Add(int.Parse(Console.ReadLine()));
            }
            foreach (int a in array)
            {
                if (a < input[0])
                {
                    Console.WriteLine(input[0] - a);
                }
                else if (input[1] < a)
                {
                    Console.WriteLine("-1");
                }
                else
                {
                    Console.WriteLine("0");
                }
            }
        }*/
        //ABC36B
        /*static void Main()
        {
            int N = int.Parse(Console.ReadLine());
            List<string> map = new List<string>();
            for (int i =0;i< N;i++)
            {
                map.Add(Console.ReadLine());
            }
            List<string> ans = new List<string>();
            for(int j = 0; j  < N;j++)
            {
                var temp = "";
                for (int i = N-1; i >= 0; i--)
                {
                    temp += map[i][j];
                }
                ans.Add(temp);
            }
            foreach (string a in ans)
            {
                Console.WriteLine(a);
            }
        }*/
        //ABC40B
        /*static void Main()
        {
            int N = int.Parse(Console.ReadLine());
            int A = 0;
            int temp = N;
            if (N == 1)
            {
                Console.WriteLine("0");
            }
            else
            {
                while (true)
                {
                    double root = Math.Sqrt(N);
                    if (root != (int)root)
                    {
                        N--;
                    }
                    else
                    {
                        A = (int)root;
                        break;
                    }
                }
                List<int> answer = new List<int>();
                bool flag = false;
                while (A > 0)
                {
                    var a = A;
                    while (A * a <= temp)
                    {
                        var ans = temp - (A * a) + Math.Abs(A - a);
                        if (ans == 0)
                        {
                            flag = true;
                            break;
                        }
                        a++;
                        answer.Add(ans);
                    }
                    if (flag == true)
                    {
                        break;
                    }
                    A--;
                }
                if (flag)
                {
                    Console.WriteLine("0");
                }
                else
                {
                    Console.WriteLine(answer.Min());
                }
            }
        }*/
        //ABC122C
        //TLE
        /*static void Main()
        {
            int[] input = Console.ReadLine().Split().Select(int.Parse).ToArray();
            string S = Console.ReadLine();
            List<int[]> array = new List<int[]>();
            for (int i = 0; i < input[1]; i++)
            {
                array.Add(Console.ReadLine().Split().Select(int.Parse).ToArray());
            }
            List<int> answer = new List<int>();
            foreach (int[] n in array)
            {
                var tempstr = S.Substring(n[0]-1,n[1]-n[0]+1);
                var count = tempstr.Length - tempstr.Replace("AC","").Length;
                var ans = count / 2;
                answer.Add(ans);
            }
            foreach (int a in answer)
            {
                Console.WriteLine(a);
            }
        }*/
        /*static void Main()
        { 
            int[] input = Console.ReadLine().Split().Select(int.Parse).ToArray();
            string S = Console.ReadLine();
            List<int[]> array = new List<int[]>();
            for (int i = 0; i < input[1]; i++)
            {
                array.Add(Console.ReadLine().Split().Select(int.Parse).ToArray());
            }
            for (int i = 0;i < S.Length-1;i++)
            {
                if (S[i] == 'A')
                {
                    if (S[i + 1] == 'C')
                    {
                        S = S.Replace(S[i],'a');
                    }
                }
            }
            int count = 0;
            List<int> ansstr = new List<int>();
            for (int i = 0; i < S.Length;i++)
            {
                count = 0;
                for (int j = 0;j <= i;j++)
                {
                    if (S[j] == 'a')
                    {
                        count++;
                    }
                }
                ansstr.Add(count);
            }
            List<int> anss = new List<int>();
            for (int i = 0; i < input[1];i++)
            {
                anss.Add(ansstr[array[i][1]-2] - ansstr[array[i][0]-1]);
            }
            foreach (int a in anss)
            {
                Console.WriteLine(a);
            }
        }*/
        //ABC39B
        /*static void Main()
        {
            int X = int.Parse(Console.ReadLine());
            var ans = Math.Sqrt(X);
            var ans2 = Math.Sqrt(ans);
            Console.WriteLine(ans2);
        }*/
        //ABC38B
        /*static void Main()
        {
            int[] input1 = Console.ReadLine().Split().Select(int.Parse).ToArray();
            int[] input2 = Console.ReadLine().Split().Select(int.Parse).ToArray();
            bool flag1 = false;
            foreach (int a in input1)
            {
                foreach (int b in input2)
                {
                    if (a == b)
                    {
                        flag1 = true;
                    }
                }
            }
            if (flag1 == true)
            {
                Console.WriteLine("YES");
            }
            else
            {
                Console.WriteLine("NO");
            }
        }*/
        //ABC35B
        /*static void Main()
        {
            string S = Console.ReadLine();
            int T = int.Parse(Console.ReadLine());
            int[] pos = { 0, 0 };
            foreach (char a in S)
            {

            }
        }*/
        //ABC34B
        /*static void Main()
        {

        }*/
        //技術ProgramContest4Day1
        //A
        /*static void Main()
        {
            int[] input = Console.ReadLine().Split().Select(int.Parse).ToArray();

        }*/
        //ABC135A
        /*static void Main()
        {
            int[] input = Console.ReadLine().Split().Select(int.Parse).ToArray();
            int A = input[0];
            int B = input[1];
            var temp = B - A;
            if (temp % 2 == 0)
            {
                Console.WriteLine(A + (temp/2));
            }
            else
            {
                Console.WriteLine("IMPOSSIBLE");
            }
        }*/
        //ABC135B
        /*static void Main()
        {
            int N = int.Parse(Console.ReadLine());
            int[] P = Console.ReadLine().Split().Select(int.Parse).ToArray();
            int[] AnsN = new int[N];
            for (int i = 0;i <N;i++)
            {
                AnsN[i] = i + 1; 
            }
            int count = 0;
            for(int i = 0;i < N;i++)
            {
                if (P[i] != AnsN[i])
                {
                    count++;
                }
            }
            if (count <= 2)
            {
                Console.WriteLine("YES");
            }
            else
            {
                Console.WriteLine("NO");
            }
        }*/
        //ABC135C
        /*static void Main()
        {
            int N = int.Parse(Console.ReadLine());
            int[] A = Console.ReadLine().Split().Select(int.Parse).ToArray();
            int[] B = Console.ReadLine().Split().Select(int.Parse).ToArray();
            /*int count = 0;
            for (int i = N;i>0;i--)
            {
                var tempA = A[i] + A[i - 1];
                if (tempA <= B[i - 1])
                {
                    A[i - 1] = 0;
                    count += tempA;
                }
                else
                {
                    if (A[i] <= B[i - 1])
                    {
                        A[i - 1] = tempA - B[i - 1];
                        count += B[i - 1];
                    }
                    else
                    {
                        count += B[i - 1]; 
                    }
                }
            }*/
        /*int count = 0;
        for (int i = 0;i < N;i++)
        {
            var tempA = A[i] + A[i + 1];
            if (tempA <= B[i])
            {
                A[i + 1] = 0;
                count += tempA;
            }
            else
            {
                if (B[i] >= A[i])
                {
                    A[i + 1] = A[i + 1] - (B[i] - A[i]);
                    count += B[i];
                }
                else
                {
                    count += B[i]; 
                }
            }
        }
        //このやり方
        int count = 0;
        for (int i = 0; i < N;i++)
        {
            List<int> temp = new List<int>();
            temp.Add(A[i]);
            temp.Add(B[i]);
            count += temp.Min();

        }
        Console.WriteLine(count);
    }*/
        //ABC135D

        //ABC127A
        /*static void Main()
        {
            int[] input = Console.ReadLine().Split().Select(int.Parse).ToArray();
            string inputstr = Console.ReadLine();
            char[] temp = inputstr.ToCharArray();
            temp[input[1]-1] =  Char.ToLower(temp[input[1] -1]);
            inputstr = new string(temp);
            Console.WriteLine(inputstr);
        }*/
        //ABC35
        /*static void Main()
        {
            string S = Console.ReadLine();
            int T = int.Parse(Console.ReadLine());
            int[] ans = { 0, 0 };
            int count = 0;
            for (int i = 0; i < S.Length;i++)
            {
                if (S[i] == 'U')
                {
                    ans[1]++;
                }
                else if (S[i] == 'D')
                {
                    ans[1]--;
                }
                else if (S[i] == 'R')
                {
                    ans[0]++;
                }
                else if (S[i] == 'L')
                {
                    ans[0]--;
                }
                else
                {
                    count++;
                }
            }
            List<int[]> answer = new List<int[]>();
            answer.Add(ans);
            answer.Add(ans);
            answer.Add(ans);
            answer.Add(ans);
            foreach (int[] n in answer)
            {
                
            }
      
        }*/
        //ABC114A
        /*static void Main()
        {
            int x = int.Parse(Console.ReadLine());
            if (x == 7 || x == 5 || x == 3)
            {
                Console.WriteLine("YES");
            }
            else
            {
                Console.WriteLine("NO");
            }
        }*/
        //ABC121C
        //TLE
        /*static void Main()
        {
            long[] input = Console.ReadLine().Split().Select(long.Parse).ToArray();
            long n = input[0];
            long M = input[1];
            List<long[]> shop = new List<long[]>();
            for (int i = 0;i < n;i++)
            {
                shop.Add(Console.ReadLine().Split().Select(long.Parse) .ToArray());
            }
            List<long[]> answer = new List<long[]>(Sort(shop));
            long price = 0;
            long count = 0;
            foreach (long[] temp in answer)
            {
                var tempcount = count;
                if (count + temp[1] <= M)
                {
                    count += temp[1];
                }
                else
                {
                    count = M;
                }
                price += (count-tempcount) * temp[0];
                if (M<=count)
                {
                    break;
                }
            }
            Console.WriteLine(price);
        }
        static List<long[]> Sort(List<long[]> A)
        {
            for (int i = 0;i < A.Count;i++)
            {
                for (int j = A.Count-1;j >i;j-- )
                {
                    if (A[j][0] < A[j-1][0])
                    {
                        var temp = A[j];
                        A[j] = A[j - 1];
                        A[j - 1] = temp;
                    }
                }
            }
            return A;
        }*/
        //Sortはライブラリを使った方が早い
        /*static void Main()
        {
            long[] input = Console.ReadLine().Split().Select(long.Parse).ToArray();
            long n = input[0];
            long M = input[1];
            List<long[]> shops = new List<long[]>();
            for (int i = 0; i < n; i++)
            {
                shops.Add(Console.ReadLine().Split().Select(long.Parse).ToArray());
            }
            long count = 0;
            long ans = 0;
            foreach (long[] shop in shops.OrderBy(a => a[0]))
            {
                var i = Math.Min(M - count, shop[1]);
                ans += shop[0] * i;
                count += i;
                if (count >= M)
                {
                    break;
                }
            }
            Console.WriteLine(ans);
        }*/
        //120C
        //TLE
        /*static void Main()
        {
            /*string input = Console.ReadLine();
            int len = input.Length;
            int count = 0;
            while (input.Contains("01") || input.Contains("10"))
            {
                input = input.Replace("01", "").Replace("10", "");
                count += len - input.Length;
                len = input.Length;
            }
            Console.WriteLine(count);


            string s = Console.ReadLine();
            int zero = s.Replace("1", "").Length;
            int one = s.Replace("0", "").Length;
            Console.WriteLine((zero < one ? zero : one) * 2);
        }*/
        //119
        /*static void Main()
        {
            int[] input = Console.ReadLine().Split().Select(int.Parse).ToArray();
            int N = input[0];
            List<int> goal = new List<int>();
            List<int> list = new List<int>();
            for (int i =1;i<=N-1;i++)
            {
                goal.Add(input[i]);
            }
            for (int i = 0;i<N;i++)
            {
                list.Add(int.Parse(Console.ReadLine()));
            }

        }*/
        //118C
        //37B
        /*static void Main()
        {
            long[] input = Console.ReadLine().Split().Select(long.Parse).ToArray();
            long n = input[0];
            long k = input[1];
            List<long[]> list = new List<long[]>();
            for (int i = 0;i < k;i++)
            {
                long[] temp = Console.ReadLine().Split().Select(long.Parse).ToArray();
                list.Add(temp);
            }
            long[] Ans = new long[n];
            foreach (long[] m in list)
            {
                for (int i =0;i < Ans.Length;i++)
                {
                    if (m[0]-1 <= i && i <= m[1]-1)
                    {
                        Ans[i] = m[2];
                    }
                }
            }
            foreach (int a in Ans)
            {
                Console.WriteLine(a);
            }
        }*/
        //大手前プロコン2019
        //A
        /*static void Main()
        {
            int[] input = Console.ReadLine().Split().Select(int.Parse).ToArray();
            int A = input[0];
            int B = input[1];
            if (A + 0.5f >= B)
            {
                Console.WriteLine("1");
            }
            else
            {
                Console.WriteLine("0");
            }
        }*/
        //E
        /*static void Main()
        {
            long[] input = Console.ReadLine().Split().Select(long.Parse).ToArray();
            long N = input[0];
            long Q = input[1];
            List<long> D = new List<long>();
            for (long i = 0;i < N;i++)
            {
                D.Add(long.Parse(Console.ReadLine()));
            }
            List<long[]> TLR = new List<long[]>();
            for (long i = 0;i < Q;i++)
            {
                TLR.Add(Console.ReadLine().Split().Select(long.Parse).ToArray());
            }
       
            foreach (long[] tlr in TLR)
            {
                var count = 0;
                var tempara = new List<long>();
                var a = tlr[0];
                tempara.Add(a);
                for (long i = 1;i <= N;i++)
                {
                    if (Math.Abs(a - (-1 * i)) > D[(int)i - 1])
                    {
                        a = a - D[(int)i - 1];
                    }
                    else
                    {
                        a = -1*i;
                    }
                    tempara.Add(a);
                }
                foreach (long n in tempara) 
                {
                    if ( tlr[1]<= n && tlr[2] >= n)
                    {
                        count++;
                    }
                }
                Console.WriteLine(count);
            }

        }*/
        //AtCoderBeginnerContest136
        //136A
        /*static void Main()
        {
            int[] input = Console.ReadLine().Split().Select(int.Parse).ToArray();
            int A = input[0];
            int B = input[1];
            int C = input[2];
            var a = A - B;
            var ans = C - a;
            if (ans >= 0)
            {
                Console.WriteLine(ans);
            }
            else
            {
                Console.WriteLine("0");
            }
        }*/
        //136B
        static void Main()
        {
            string N = Console.ReadLine();
            int n = int.Parse(N);
            int ocun = 0;
            for (int i = 1; i<=n;i++)
            {
                if (i.ToString().Length % 2 == 1)
                {
                    ocun++;
                }
            }
            Console.WriteLine(ocun);
        }
        //136C
    }
}

//125C難しい
/*namespace CSharp
{
    class Program
    {
        static IEnumerable<long> EnumerateDivisors(long n)
        {
            for (long i = 1; i * i <= n; i++)
            {
                if (n % i == 0)
                {
                    yield return i;
                    if (n / i != i)
                    {
                        yield return n / i;
                    }
                }
            }
        }

        static void Main(string[] args)
        {
            ReadString();
            long[] A = ReadLongArray();

            long[] divisors = Enumerable.Concat(EnumerateDivisors(A[0]), EnumerateDivisors(A[1]))
                                        .Distinct().ToArray();
            long ans = divisors.Select(x => new { Value = x, Count = A.Count(v => v % x == 0) })
                               .Where(x => x.Count >= A.Length - 1)
                               .OrderByDescending(x => x.Value)
                               .First().Value;
            Console.WriteLine(ans);
        }

        #region Helpers

        static int[] ReadIntArray() => Console.ReadLine().Split().Select(s => int.Parse(s)).ToArray();
        static long[] ReadLongArray() => Console.ReadLine().Split().Select(s => long.Parse(s)).ToArray();

        static int[] ReadLineIntArray(int count) => Enumerable.Repeat(0, count).Select(_ => int.Parse(Console.ReadLine())).ToArray();
        static long[] ReadLineLongArray(int count) => Enumerable.Repeat(0, count).Select(_ => long.Parse(Console.ReadLine())).ToArray();

        static string ReadString() => Console.ReadLine();
        static int ReadInt() => int.Parse(Console.ReadLine());
        static long ReadLong() => long.Parse(Console.ReadLine());

        static void ReadInt(out int first)
        {
            var array = ReadIntArray();
            first = array[0];
        }

        static void ReadInt(out int first, out int second)
        {
            var array = ReadIntArray();
            first = array[0];
            second = array[1];
        }

        static void ReadInt(out int first, out int second, out int third)
        {
            var array = ReadIntArray();
            first = array[0];
            second = array[1];
            third = array[2];
        }

        static void ReadInt(out int first, out int second, out int third, out int fourth)
        {
            var array = ReadIntArray();
            first = array[0];
            second = array[1];
            third = array[2];
            fourth = array[3];
        }

        static void ReadLong(out long first)
        {
            var array = ReadLongArray();
            first = array[0];
        }

        static void ReadLong(out long first, out long second)
        {
            var array = ReadLongArray();
            first = array[0];
            second = array[1];
        }

        static void ReadLong(out long first, out long second, out long third)
        {
            var array = ReadLongArray();
            first = array[0];
            second = array[1];
            third = array[2];
        }

        static void ReadLong(out long first, out long second, out long third, out long fourth)
        {
            var array = ReadLongArray();
            first = array[0];
            second = array[1];
            third = array[2];
            fourth = array[3];
        }

        #endregion
    }
}*/