Problem:
Score : 300 points

Problem Statement

You are given a string S of length N consisting of A, C, G and T. Answer the following Q queries:

Query i (1 \leq i \leq Q): You will be given integers l_i and r_i (1 \leq l_i < r_i \leq N). Consider the substring of S starting at index l_i and ending at index r_i (both inclusive). In this string, how many times does AC occurs as a substring?

Notes

A substring of a string T is a string obtained by removing zero or more characters from the beginning and the end of T.

For example, the substrings of ATCODER include TCO, AT, CODER, ATCODER and (the empty string), but not AC.

Constraints

2 \leq N \leq 10^5

1 \leq Q \leq 10^5

S is a string of length N.

Each character in S is A, C, G or T.

1 \leq l_i < r_i \leq N

Input

Input is given from Standard Input in the following format:

N Q
S
l_1 r_1
:
l_Q r_Q

Output

Print Q lines. The i-th line should contain the answer to the i-th query.

Sample Input 1

8 3
ACACTACG
3 7
2 3
1 8

Sample Output 1

2
0
3

Query 1: the substring of S starting at index 3 and ending at index 7 is ACTAC. In this string, AC occurs twice as a substring.

Query 2: the substring of S starting at index 2 and ending at index 3 is CA. In this string, AC occurs zero times as a substring.

Query 3: the substring of S starting at index 1 and ending at index 8 is ACACTACG. In this string, AC occurs three times as a substring.

Solution in Haskell (GHC 7.10.3) (judge verdict: Accepted)


import qualified Data.Vector.Unboxed as V
import Data.Array.IArray (listArray, accumArray, (!))
import Data.Array.MArray
import Data.Array.ST (STUArray, runSTUArray)
import Data.Array.Unboxed (UArray)
import Data.List (sortOn, sortBy, unfoldr, partition)
import Data.Char (isSpace)
import Control.Monad.ST (ST)
import Control.Monad.Trans.State (StateT(..))
import qualified Data.ByteString.Char8 as B

import Debug.Trace (trace)

-- utility functions

--tr x = trace (show x) x
tr = id

--   Input functions
readInt = B.readInt . B.dropWhile isSpace

readInts :: Int -> B.ByteString -> [Int]
readInts n = take n . unfoldr readInt

readIntsV :: Int -> B.ByteString -> V.Vector Int
readIntsV n = V.unfoldrN n readInt

readCharV :: Int -> B.ByteString -> V.Vector Char
readCharV n = V.unfoldrN n f where
  f bs = Just (B.head bs, B.tail bs)

readIntsA :: Int -> B.ByteString -> UArray Int Int
readIntsA n bs = runSTUArray $ do
  arr <- newArray_ (0,n-1)
  go arr 0 bs
  return arr
  where
    go :: STUArray s Int Int -> Int -> B.ByteString -> ST s ()
    go arr i bs
      | i==n = return ()
      | otherwise = do
        let Just (x,bs') = readInt bs
        writeArray arr i x
        go arr (i+1) bs'

readTsV :: Int -> B.ByteString -> V.Vector (Int,Int)
readTsV n = V.unfoldrN n $ runStateT ((,) <$> StateT readInt <*> StateT readInt)

readTs :: Int -> B.ByteString -> [(Int,Int)]
readTs n = take n . unfoldr readT where
  readT = runStateT ((,) <$> StateT readInt <*> StateT readInt)

-- main

lowerBound size sat = go (-1) size where
  go l r
    | l==r-1 = r
    | sat m = go l m
    | otherwise = go m r
    where m = (l+r)`div`2

upperBound size sat = go (-1) size where
  go l r
    | l==r-1 = l
    | sat m = go m r
    | otherwise = go l m
    where m = (l+r)`div`2

(!*) = V.unsafeIndex

enumACPos xs = go xs 0 where
  go xs i
    | B.null xs = V.empty
    | B.head xs == 'A' = go' (B.tail xs) (i+1)
    | otherwise = go (B.tail xs) (i+1)
  go' xs i
    | B.null xs = V.empty
    | B.head xs == 'A' = go' (B.tail xs) (i+1)
    | B.head xs == 'C' = V.cons i  $ go (B.tail xs) (i+1)
    | otherwise = go (B.tail xs) (i+1)

solv :: B.ByteString -> V.Vector (Int,Int) -> IO ()
solv s qs = V.forM_ qs $ print . solv1
  where
    acpos = enumACPos s
    solv1 (l,r) = right - left + 1 where
      left = lowerBound (V.length acpos) (\i -> l <= acpos!*i )
      right = upperBound (V.length acpos) (\i -> (acpos!*i)+1 <= r)
      

main = do
  [n,q] <- map read . words <$> getLine :: IO [Int]
  s <- B.getLine
  qs <- readTsV q <$> B.getContents
  solv s qs