{-# LANGUAGE BangPatterns #-}
import Data.Bits
import Data.List
maxInt :: Int64
maxInt = 4294967295
countOnes' :: Int64 -> Integer
countOnes' !0 = 0
countOnes' !a = (fromIntegral (a .&. 1)) + (countOnes' (a `shiftR` 1))
getLog
!n
= fromJust
$ findIndex
(> n
) $ map (1 `shiftL`
) [0..]
countOnes
:: Int64
-> Int64
-> IntegercountOnes !a !b | a > b = 0
countOnes !a !b | a == b = countOnes' a
countOnes !0 !n = range + leading + (countOnes 0 (n - (1 `shiftL` m)))
where
range = fromIntegral $ m * (1 `shiftL` (m - 1))
leading = fromIntegral $ (n - (1 `shiftL` m) + 1)
m = (getLog n) - 1
countOnes !a !b | a > 0 = (countOnes 0 b) - (countOnes 0 (a - 1))
countOnes !a !0 | a < 0 = countOnes (maxInt + a + 1) maxInt
countOnes !a !b | b < 0 = (countOnes a 0) - (countOnes (b + 1) 0)
countOnes !a !b | a < 0 = (countOnes a 0) + (countOnes 0 b)
splitBy :: Char -> String -> [String]
splitBy _ [] = []
splitBy c s = first : splitBy c (dropWhile (== c) rest)
where
(first, rest) = break (== c) s
readLineInt :: IO Int
readLineInt = getLine >>= return . read
readLineInts :: IO [Int64]
readLineInts = getLine >>= return . map read . (splitBy ' ')
main :: IO ()
main = do
n <- readLineInt
doIt n
doIt :: Int -> IO ()
doIt !0 = return ()
doIt !n = do
l <- readLineInts
putStrLn $ show $ countOnes (head l) (head $ tail l)
doIt (n - 1)