Erlang Genomic Range Query
-module(genomic_range_query).
-export([genomic_range_query/3]).

genomic_range_query(S, P, Q) ->
    [classify(string:slice(S, Pi, Qi - Pi + 1)) || {Pi, Qi} <- lists:zip(P, Q)].

classify(Sub) ->
    case lists:member($A, Sub) of
        true -> 1;
        false ->
            case lists:member($C, Sub) of
                true -> 2;
                false ->
                    case lists:member($G, Sub) of
                        true -> 3;
                        false -> 4
                    end
            end
    end.

This builds prefix counts for each DNA letter so every query can return the minimum impact factor quickly.