// Original Python3 code (must be included according to AtCoder rules) /* from bisect import* n,q=map(int,input().split()) s=input() e=[] for i in range(1000): if i%8==0 and'0'not in str(i): e+=[*str(i)], idx={} for i in'123456789': idx[i]=[] for i in range(n): idx[s[i]]+=i, INF=1<<60 bs=[-1]*10 for _ in range(q): l,r=map(int,input().split()) l-=1 d=r-l m=min(d,3) ans=INF for i in range(1,10): bs[i]=bisect(idx[str(i)],r-1)-1 for st in e: if m!=len(st): continue p={} a=0 pos=r-1 mv=[] for j in range(m): ns=st[~j] k=bs[int(ns)] if ns not in p: p[ns]=0 if 0<=k-p[ns] using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, q; cin >> n >> q; string s; cin >> s; vector e; for (int i = 0; i < 1000; i++) { if (i % 8 == 0) { string t = to_string(i); if (t.find('0') == string::npos) { string tmp = ""; for (char c : t) tmp.push_back(c); e.push_back(tmp); } } } unordered_map> idx; for (char c = '1'; c <= '9'; c++) idx[c] = {}; for (int i = 0; i < n; i++) { idx[s[i]].push_back(i); } const long long INF = 1LL << 60; vector bs(10, -1); while (q--) { int l, r; cin >> l >> r; l -= 1; int d = r - l; int m = min(d, 3); long long ans = INF; for (int i = 1; i <= 9; i++) { auto &vec = idx['0' + i]; auto it = upper_bound(vec.begin(), vec.end(), r - 1); bs[i] = int(it - vec.begin()) - 1; } for (auto &st : e) { if (m != (int)st.size()) continue; unordered_map p; long long a = 0; int pos = r - 1; vector mv; bool ok = true; for (int j = 0; j < m; j++) { char ns = st[m - 1 - j]; // st[~j] in Python int k = bs[ns - '0']; if (!p.count(ns)) p[ns] = 0; int idxpos = k - p[ns]; if (0 <= idxpos && idxpos < (int)idx[ns].size() && l <= idx[ns][idxpos]) { int nxt = idx[ns][idxpos]; for (int t : mv) { if (t < idx[ns][idxpos]) nxt -= 1; } a += abs(pos - nxt); mv.push_back(idx[ns][idxpos]); p[ns] += 1; } else { a = INF; ok = false; break; } pos -= 1; } ans = min(ans, a); } if (ans < INF) cout << ans << "\n"; else cout << -1 << "\n"; } }