#include <cstdio>
#include <algorithm>
using namespace std;
const int N=200010;
const int INF=1e9;
char s[N];
struct Node{
int m[5][5];
Node operator + (Node x){
Node ans;
for(int i=0;i<5;i++)
for(int j=i;j<5;j++){
ans.m[i][j]=INF;
for(int k=i;k<=j;k++)ans.m[i][j]=min(ans.m[i][j],m[i][k]+x.m[k][j]);
}
return ans;
}
}a[N<<2];
void build(int l,int r,int o){
if(l==r){
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
if(i==j)a[o].m[i][j]=0;
else a[o].m[i][j]=INF;
if(s[l]=='2')a[o].m[0][0]=1,a[o].m[0][1]=0;
if(s[l]=='0')a[o].m[1][1]=1,a[o].m[1][2]=0;
if(s[l]=='1')a[o].m[2][2]=1,a[o].m[2][3]=0;
if(s[l]=='7')a[o].m[3][3]=1,a[o].m[3][4]=0;
if(s[l]=='6')a[o].m[4][4]=1,a[o].m[3][3]=1;
return;
}
int mid=l+r>>1;
build(l,mid,o*2); build(mid+1,r,o*2+1);
a[o]=a[o*2]+a[o*2+1];
}
Node quire(int o,int L,int R,int l,int r){
if(l<=L&&R<=r)return a[o];
int mid=L+R>>1;
if(mid<l)return quire(o*2+1,mid+1,R,l,r);
if(mid>=r)return quire(o*2,L,mid,l,r);
return quire(o*2,L,mid,l,r)+quire(o*2+1,mid+1,R,l,r);
}
int main(){
int n,q;
while(scanf("%d%d\n%s",&n,&q,s+1)!=EOF){
build(1,n,1);
while(q--){
int l,r;
scanf("%d%d",&l,&r);
int ans=quire(1,1,n,l,r).m[0][4];
if(ans==INF)puts("-1");
else printf("%d\n",quire(1,1,n,l,r).m[0][4]);
}
}
return 0;
}