#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll inf = 2000000000000;
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    ll n, q, l, r;
    cin >> n >> q;
    vector<ll>sufiks7(n + 1, 0);
    vector<ll>prefiks6(n + 1, 0);
    vector<ll>prefiksup(n + 1, 0);
    vector<ll>poz;
    vector<char>v(n);
    for(ll i = 0; i < n; i++){
        cin >> v[i];
        if(v[i] == '?'){
            poz.push_back(i);
        }
    }
    if(v[n - 1] == '7'){
        sufiks7[n - 1] = 1;
    }
    if(v[0] == '6'){
        prefiks6[0] = 1;
    }
    if(v[0] == '?'){
        prefiksup[0] = 1;
    }
    for(ll i = 1; i < n; i++){
        prefiks6[i] = prefiks6[i - 1];
        prefiksup[i] = prefiksup[i - 1];
        if(v[i] == '6'){
            prefiks6[i] += 1;
        }
        if(v[i] == '?'){
            prefiksup[i] += 1;
        }
    }
    for(ll i = n - 2; i >= 0; i--){
        sufiks7[i] = sufiks7[i + 1];
        if(v[i] == '7'){
            sufiks7[i] += 1;
        }
    }
    vector<ll>zbirsuf7(n, 0);
    vector<ll>zbirpref6(n, 0);
    vector<ll>upsuf7(n, 0);
    vector<ll>upref6(n, 0);
    for(ll i = 1; i < n; i++){
        zbirpref6[i] = zbirpref6[i - 1];
        upref6[i] = upref6[i - 1];
        if(v[i] == '7'){
            zbirpref6[i] += prefiks6[i];
        }
        if(v[i] == '?'){
            upref6[i] += prefiks6[i];
        }
    }
    for(ll i = n - 2; i >= 0; i--){
        zbirsuf7[i] = zbirsuf7[i + 1];
        upsuf7[i] = upsuf7[i + 1];
        if(v[i] == '6'){
            zbirsuf7[i] += sufiks7[i];
        }
        if(v[i] == '?'){
            upsuf7[i] += sufiks7[i];
        }
    }
   /* for(ll i = 0; i < n; i++){
        cout << sufiks7[i] << " ";
    }
    cout << endl;
    for(ll i = 0; i < n; i++){
        cout << prefiks6[i] << " ";
    }
    cout << endl;
    for(ll i = 0; i < n; i++){
        cout << upref6[i] << " ";
    }
    cout << endl;
    for(ll i = 0; i < n; i++){
        cout << zbirsuf7[i] << " ";
    }
    cout << endl;*/
    while(q--){
        cin >> l >> r;
        l--;
        r--;
        ll br6 = prefiks6[r] - prefiks6[l];
        ll br7 = sufiks7[l] - sufiks7[r];
        if(v[l] == '6'){
            br6++;
        }
        if(v[r] == '7'){
            br7++;
        }
        ll brup = r - l + 1;
        brup -= br6;
        brup -= br7;
        ll baza;
        if(r < n - 1){
            baza = zbirsuf7[l] - zbirsuf7[r + 1] - br6*sufiks7[r];
        }
        else{
            baza = zbirsuf7[l] - br6*sufiks7[r];
        }
        if(v[r] == '7'){
            baza += br6;
        }
        ll upre, prviup, poslednjiup, opcijasve7;
        if(l == 0){
            upre = 0;
        }
        else{
            upre = prefiksup[l - 1];
        }
        ll tl = 1, tr = brup; // mozda mogu da budu sve 7!!!
        if(poz.size()){
            prviup = poz[upre];
            poslednjiup = poz[upre + brup - 1];
        }
        ll posle7 = sufiks7[l] - br7;
        ll pre6 = prefiks6[r] - br6;
        ll res = 0;
        while(tl <= tr){
            ll m = (tl + tr) / 2;
            ll m1 = (tl + tr + 1) / 2;
            ll pos = poz[upre + m - 1];
            ll dodajemo1 = 0;
            ll novih6 = m;
            ll novih7 = brup - m;
            dodajemo1 += novih6 * novih7;
            if(pos != n - 1){
                if(r < n - 1){
                    dodajemo1 += upsuf7[prviup] - upsuf7[pos + 1] - novih6*sufiks7[r + 1];
                }
                else{
                    dodajemo1 += upsuf7[prviup] - upsuf7[pos + 1];
                }
            }
            else{
                dodajemo1 += upsuf7[prviup];
            }
            if(novih7){
                ll pos2 = poz[upre + m];
                if(pos2 != 0){
                    if(l > 0){
                        dodajemo1 += upref6[poslednjiup] - upref6[pos2 - 1] - novih7*prefiks6[l - 1];
                    }
                    else{
                        dodajemo1 += upref6[poslednjiup] - upref6[pos2 - 1];
                    }
                }
                else{
                    dodajemo1 += upref6[poslednjiup];
                }
            }
            ll pos1 = poz[upre + m1 - 1];
            ll dodajemo11 = 0;
            ll novih61 = m1;
            ll novih71 = brup - m1;
            dodajemo11 += novih61 * novih71;
            if(pos1 != n - 1){
                if(r < n - 1){
                    dodajemo11 += upsuf7[prviup] - upsuf7[pos1 + 1] - novih61*sufiks7[r + 1];
                }
                else{
                    dodajemo11 += upsuf7[prviup] - upsuf7[pos1 + 1];
                }
            }
            if(novih71){
                ll pos21 = poz[upre + m1];
                if(pos21 != 0){
                    if(l > 0){
                        dodajemo11 += upref6[poslednjiup] - upref6[pos21 - 1] - novih71*prefiks6[l - 1];
                    }
                    else{
                        dodajemo11 += upref6[poslednjiup] - upref6[pos21 - 1];
                    }
                }
                else{
                    dodajemo11 += upref6[poslednjiup];
                }
            }
            if(dodajemo1 < dodajemo11){
                tl = m1;
                res = dodajemo11;
            }
            else{
                tr = m;
                res = dodajemo1;
            }
            if(tl == tr){
                break;
            }
        }
        if(brup){
            opcijasve7 = 0;
            ll pos3 = prviup;
            if(pos3 != 0){
                if(l > 0){
                    opcijasve7 += upref6[poslednjiup] - upref6[pos3 - 1] - brup*prefiks6[l - 1];
                }
                else{
                    opcijasve7 += upref6[poslednjiup] - upref6[pos3 - 1];
                }
            }
            else{
                opcijasve7 += upref6[poslednjiup];
            }
        }
        cout << max(res + baza, opcijasve7 + baza) << "\n";
    }

}