#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 200000;
const int MAX_E2 = 1 << 19;
const int M = 5;
const int INF = 1 << 29;
struct Elm {
  int ms[M][M];
  Elm() {}
  void init() {
    for (int i = 0; i < M; i++) fill(ms[i], ms[i] + M, INF), ms[i][i] = 0;
  }
  int get(int i, int j) const { return ms[i][j]; }
  void set(int i, int j, int v) { ms[i][j] = v; }
  void _setmin(int &a, int b) const {
    if (a > b) a = b;
  }
  Elm operator+(const Elm &e) const {
    Elm r;
    for (int i = 0; i < M; i++)
      for (int j = i; j < M; j++) {
        r.ms[i][j] = INF;
        for (int k = i; k <= j; k++) _setmin(r.ms[i][j], ms[i][k] + e.ms[k][j]);
      }
    return r;
  }
  void print() {
    for (int i = 0; i < M; i++) {
      for (int j = 0; j < M; j++) printf("%d ", ms[i][j]);
      putchar('\n');
    }
  }
};
template <typename T, const int MAX_E2>
struct SegTree {
  int e2;
  T nodes[MAX_E2], z;
  SegTree() {}
  void init(int n, T _z) {
    z = _z;
    for (e2 = 1; e2 < n; e2 <<= 1)
      ;
    fill(nodes, nodes + MAX_E2, z);
  }
  T &get(int i) { return nodes[e2 - 1 + i]; }
  void seti(int i, T v) { get(i) = v; }
  void setall() {
    for (int j = e2 - 2; j >= 0; j--)
      nodes[j] = nodes[j * 2 + 1] + nodes[j * 2 + 2];
  }
  T sum_range(int r0, int r1, int k, int i0, int i1) {
    if (r1 <= i0 || i1 <= r0) return z;
    if (r0 <= i0 && i1 <= r1) return nodes[k];
    int im = (i0 + i1) / 2;
    T v0 = sum_range(r0, r1, k * 2 + 1, i0, im);
    T v1 = sum_range(r0, r1, k * 2 + 2, im, i1);
    return v0 + v1;
  }
  T sum_range(int r0, int r1) { return sum_range(r0, r1, 0, 0, e2); }
};
char s[MAX_N + 4];
SegTree<Elm, MAX_E2> st;
int main() {
  int n, qn;
  scanf("%d%d%s", &n, &qn, s);
  Elm zelm;
  zelm.init();
  st.init(n, zelm);
  for (int i = 0; i < n; i++) {
    Elm e;
    e.init();
    switch (s[i]) {
      case '2':
        e.set(0, 0, 1);
        e.set(0, 1, 0);
        break;
      case '0':
        e.set(1, 1, 1);
        e.set(1, 2, 0);
        break;
      case '1':
        e.set(2, 2, 1);
        e.set(2, 3, 0);
        break;
      case '6':
        e.set(3, 3, 1);
        e.set(4, 4, 1);
        break;
      case '7':
        e.set(3, 3, 1);
        e.set(3, 4, 0);
        break;
    }
    st.seti(i, e);
  }
  st.setall();
  while (qn--) {
    int l, r;
    scanf("%d%d", &l, &r);
    l--;
    Elm e = st.sum_range(l, r);
    int v = e.get(0, 4);
    printf("%d\n", (v >= INF) ? -1 : v);
  }
  return 0;
}
