#include using namespace std; // #include // using namespace atcoder; // using mint = modint998244353; using ll = long long; #define fix(x) fixed << setprecision(x) #define rep(i, n) for(int i = 0; i < n; ++i) #define all(x) (x).begin(),(x).end() templatebool chmin(T&a, const T&b){if(a>b){a=b;return 1;}return 0;} templatebool chmax(T&a, const T&b){if(a> z; for(int i=112;i<1000;i+=8){ vector x(3); int y = i; bool f = true; rep(j,3){ if(y%10==0) f = false; x[j] = y%10; y /= 10; } if(f) z.emplace_back(x); } int n,q; string s; cin >> n >> q >> s; vector> pre(n+1, vector(10,-1)); vector y(10,-1); rep(i,n){ y[s[i]-'0'] = i; rep(j,10) pre[i+1][j] = y[j]; } while(q--){ int l,r; cin >> l >> r; --l; if(r-l==1){ cout << (s[l]=='8'?0:-1) << '\n'; continue; }else if(r-l==2){ int p = s[l]-'0', q = s[l+1]-'0', ans = -1; if(!((q*10+p)&7)) ans = 1; if(!((p*10+q)&7)) ans = 0; cout << ans << '\n'; continue; } int ans = INF; for(auto& v:z){ int upd = 0; vector now(10,r), u(3); rep(i,3){ int x = v[i], k = pre[now[x]][x]; now[x] = k; u[i] = k; if(ku[1]) swap(u[2],u[1]), ++upd; if(u[1]>u[0]) swap(u[1],u[0]), ++upd; if(u[2]>u[1]) swap(u[2],u[1]), ++upd; chmin(ans, upd); } if(ans==INF) ans = -1; cout << ans << '\n'; } return 0; }