#include <bits/stdc++.h>
using namespace std ;
const int MAXN = 6e4 + 10 ;
struct day {
int l, r, id ;
}q[MAXN] ;
int a[MAXN], now ;
int cnt[(1 << 26) + 10], belong[MAXN] ;
inline int read() {
register int x = 0, f = 0;
register char ch = getchar();
while (ch < '0' || ch > '9')
f |= ch == '-', ch = getchar();
while (ch >= '0' && ch <= '9')
x = (x << 3) + (x << 1) + (ch ^ 48), ch = getchar();
return f ? -x : x;
}
inline bool cmp (day a, day b) {
if (belong[a.l] != belong[b.l]) return belong[a.l] < belong[b.l] ;
else if (belong[a.l] & 1) return a.r < b.r ;
else return a.r > b.r ;
}
inline void add(int x) {
now += cnt[a[x]] ;
cnt[a[x]]++ ;
for (int i = 0 ; i <= 25 ; i++) now += cnt[a[x] ^ (1 << i)] ;
}
inline void delet(int x) {
cnt[a[x]]-- ;
now -= cnt[a[x]] ;
for (int i = 0 ; i <= 25 ; i++) now -= cnt[a[x] ^ (1 << i)] ;
}
int ans[MAXN] ;
int main () {
int n, m ;
n = read(), m = read() ;
getchar() ;
for (int i = 1 ; i <= n ; i++) {
a[i] = 1 << (getchar() - 'a') ;
a[i] ^= a[i- 1] ;
}
for (int i = 1 ; i <= m ; i++) {
q[i].l = read(), q[i].r = read() ;
q[i].id = i ;
}
int len = pow(n, 2.0 / 3.0), num = ceil((double)n / len) ;
for (int i = 1 ; i <= num ; i++){
for (int j = (i - 1) * len + 1 ; j <= i * len ; j++) belong[j] = i ;
}
sort(q + 1, q + m + 1, cmp) ;
int l = 1, r = 0 ;
for (int i = 1 ; i <= m ; i++) {
int x = q[i].l - 1, y = q[i].r ;
while (l < x) delet(l++) ;
while (l > x) add(--l) ;
while (r < y) add(++r) ;
while (r > y) delet(r--) ;
ans[q[i].id] = now ;
}
for (int i = 1 ; i <= m ; i++) printf("%d\n", ans[i]) ;
}