#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vll;
#define pb push_back
#define ff first
#define ss second
const int N = 1024 * 1024;
ll tree[2 * N][3];
struct quer{
int l, r, ind;
};
void upd(int v, ll val, int t){
v += N;
while(v) {
tree[v][t] += val;
v >>= 1;
}
}
ll query(int l, int r, int t){
l += N;
r += N;
ll wyn = 0;
while(l <= r) {
if(l & 1) wyn += tree[l++][t];
if(!(r & 1)) wyn += tree[r--][t];
l >>= 1; r >>= 1;
}
return wyn;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int n, q;
cin >> n >> q;
string s, t = "^#";
cin >> s;
for(char c : s){
t += c;
t += '#';
}
t += '$';
int m = t.size();
vi p(m, 0);
int g = 0, manacher = 0;
for(int i = 1; i < m - 1; i++){
int odwr = 2 * g - i;
if(manacher > i){
p[i] = min(manacher - i, p[odwr]);
}else{
p[i] = 0;
}
while(t[i + 1 + p[i]] == t[i - 1 - p[i]]) p[i]++;
if(i + p[i] > manacher) {
g = i;
manacher = i + p[i];
}
}
vi pr(2 * n + 1), cl(2 * n + 1), cr(2 * n + 1), grl(2 * n + 1), grr(2 * n + 1);
for(int x = 2; x <= 2 * n; x++){
cl[x] = x / 2;
cr[x] = (x + 1) / 2;
pr[x] = (p[x] + 1) / 2;
grl[x] = cl[x] - pr[x];
grr[x] = cr[x] + pr[x];
}
vector<vector<quer>> ql(n + 1), qr(n + 1);
for(int i = 0; i < q; i++){
int l, r;
cin >> l >> r;
ql[l].pb({l, r, i});
qr[r].pb({l, r, i});
}
vll wyn(q, 0);
vector<vi> el(n + 2);
for(int x = 2; x <= 2 * n; x++){
upd(x, cl[x] + 1, 1);
upd(x, 1, 2);
int tr = grl[x] + 1;
if(tr > n) tr = n + 1;
if(tr >= 1) el[tr].pb(x);
}
for(int aktl = n + 1; aktl >= 1; aktl--){
for(int x : el[aktl]) {
upd(x, -(cl[x] + 1), 1);
upd(x, -1, 2);
upd(x, pr[x], 0);
}
if(aktl <= n){
for(auto &zap : ql[aktl]){
int aktr = zap.r;
ll s1 = query(2 * aktl, aktl + aktr, 0);
ll s2c = query(2 * aktl, aktl + aktr, 1);
ll s2cnt = query(2 * aktl, aktl + aktr, 2);
wyn[zap.ind] += s1 + s2c - 1ll * aktl * s2cnt;
}
}
}
vector<vi> er(n + 1);
for(int i = 0; i < 2 * N; i++){
tree[i][0] = 0; tree[i][1] = 0; tree[i][2] = 0;
}
for(int x = 2; x <= 2 * n; x++){
upd(x, cr[x] - 1, 1);
upd(x, 1, 2);
int tr = grr[x] - 1;
if(tr < 0) tr = 0;
if(tr <= n) er[tr].pb(x);
}
for(int aktr = 0; aktr <= n; aktr++){
for(int x : er[aktr]){
upd(x, -(cr[x] - 1), 1);
upd(x, -1, 2);
upd(x, pr[x], 0);
}
if(aktr >= 1){
for(auto &zap : qr[aktr]){
int aktl = zap.l;
ll s1 = query(aktl + aktr + 1, 2 * aktr, 0);
ll s2c = query(aktl + aktr + 1, 2 * aktr, 1);
ll s2cnt = query(aktl + aktr + 1, 2 * aktr, 2);
wyn[zap.ind] += s1 + 1LL * aktr * s2cnt - s2c;
}
}
}
for(int i = 0; i < q; i++){
cout << wyn[i] << "\n";
}
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdHlwZWRlZiBsb25nIGxvbmcgbGw7CnR5cGVkZWYgcGFpcjxpbnQsIGludD4gcGlpOwp0eXBlZGVmIHBhaXI8bGwsIGxsPiBwbGw7CnR5cGVkZWYgdmVjdG9yPGludD4gdmk7CnR5cGVkZWYgdmVjdG9yPGxsPiB2bGw7CiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgZmYgZmlyc3QKI2RlZmluZSBzcyBzZWNvbmQKCmNvbnN0IGludCBOID0gMTAyNCAqIDEwMjQ7CmxsIHRyZWVbMiAqIE5dWzNdOwoKc3RydWN0IHF1ZXJ7CiAgICBpbnQgbCwgciwgaW5kOwp9OwoKdm9pZCB1cGQoaW50IHYsIGxsIHZhbCwgaW50IHQpewogICAgdiArPSBOOwogICAgd2hpbGUodikgewogICAgICAgIHRyZWVbdl1bdF0gKz0gdmFsOwogICAgICAgIHYgPj49IDE7CiAgICB9Cn0KCmxsIHF1ZXJ5KGludCBsLCBpbnQgciwgaW50IHQpewogICAgbCArPSBOOwogICAgciArPSBOOwogICAgbGwgd3luID0gMDsKICAgIHdoaWxlKGwgPD0gcikgewogICAgICAgIGlmKGwgJiAxKSB3eW4gKz0gdHJlZVtsKytdW3RdOwogICAgICAgIGlmKCEociAmIDEpKSB3eW4gKz0gdHJlZVtyLS1dW3RdOwogICAgICAgIGwgPj49IDE7IHIgPj49IDE7CiAgICB9CiAgICByZXR1cm4gd3luOwp9CgppbnQgbWFpbigpIHsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7CiAgICBjaW4udGllKDApOwoKICAgIGludCBuLCBxOwogICAgY2luID4+IG4gPj4gcTsKCiAgICBzdHJpbmcgcywgdCA9ICJeIyI7CiAgICBjaW4gPj4gczsKICAgIGZvcihjaGFyIGMgOiBzKXsKICAgICAgICB0ICs9IGM7CiAgICAgICAgdCArPSAnIyc7CiAgICB9CiAgICB0ICs9ICckJzsKCiAgICBpbnQgbSA9IHQuc2l6ZSgpOwogICAgdmkgcChtLCAwKTsKICAgIGludCBnID0gMCwgbWFuYWNoZXIgPSAwOwoKICAgIGZvcihpbnQgaSA9IDE7IGkgPCBtIC0gMTsgaSsrKXsKICAgICAgICBpbnQgb2R3ciA9IDIgKiBnIC0gaTsKICAgICAgICBpZihtYW5hY2hlciA+IGkpewogICAgICAgICAgICBwW2ldID0gbWluKG1hbmFjaGVyIC0gaSwgcFtvZHdyXSk7CiAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIHBbaV0gPSAwOwogICAgICAgIH0KICAgICAgICB3aGlsZSh0W2kgKyAxICsgcFtpXV0gPT0gdFtpIC0gMSAtIHBbaV1dKSBwW2ldKys7CgogICAgICAgIGlmKGkgKyBwW2ldID4gbWFuYWNoZXIpIHsKICAgICAgICAgICAgZyA9IGk7CiAgICAgICAgICAgIG1hbmFjaGVyID0gaSArIHBbaV07CiAgICAgICAgfQogICAgfQoKICAgIHZpIHByKDIgKiBuICsgMSksIGNsKDIgKiBuICsgMSksIGNyKDIgKiBuICsgMSksIGdybCgyICogbiArIDEpLCBncnIoMiAqIG4gKyAxKTsKICAgIGZvcihpbnQgeCA9IDI7IHggPD0gMiAqIG47IHgrKyl7CiAgICAgICAgY2xbeF0gPSB4IC8gMjsKICAgICAgICBjclt4XSA9ICh4ICsgMSkgLyAyOwogICAgICAgIHByW3hdID0gKHBbeF0gKyAxKSAvIDI7CiAgICAgICAgZ3JsW3hdID0gY2xbeF0gLSBwclt4XTsKICAgICAgICBncnJbeF0gPSBjclt4XSArIHByW3hdOwogICAgfQoKICAgIHZlY3Rvcjx2ZWN0b3I8cXVlcj4+IHFsKG4gKyAxKSwgcXIobiArIDEpOwogICAgZm9yKGludCBpID0gMDsgaSA8IHE7IGkrKyl7CiAgICAgICAgaW50IGwsIHI7CiAgICAgICAgY2luID4+IGwgPj4gcjsKICAgICAgICBxbFtsXS5wYih7bCwgciwgaX0pOwogICAgICAgIHFyW3JdLnBiKHtsLCByLCBpfSk7CiAgICB9CgogICAgdmxsIHd5bihxLCAwKTsKICAgIHZlY3Rvcjx2aT4gZWwobiArIDIpOwoKICAgIGZvcihpbnQgeCA9IDI7IHggPD0gMiAqIG47IHgrKyl7CiAgICAgICAgdXBkKHgsIGNsW3hdICsgMSwgMSk7CiAgICAgICAgdXBkKHgsIDEsIDIpOwoKICAgICAgICBpbnQgdHIgPSBncmxbeF0gKyAxOwogICAgICAgIGlmKHRyID4gbikgdHIgPSBuICsgMTsKICAgICAgICBpZih0ciA+PSAxKSBlbFt0cl0ucGIoeCk7CiAgICB9CgogICAgZm9yKGludCBha3RsID0gbiArIDE7IGFrdGwgPj0gMTsgYWt0bC0tKXsKICAgICAgICBmb3IoaW50IHggOiBlbFtha3RsXSkgewogICAgICAgICAgICB1cGQoeCwgLShjbFt4XSArIDEpLCAxKTsKICAgICAgICAgICAgdXBkKHgsIC0xLCAyKTsKICAgICAgICAgICAgdXBkKHgsIHByW3hdLCAwKTsKICAgICAgICB9CgogICAgICAgIGlmKGFrdGwgPD0gbil7CiAgICAgICAgICAgIGZvcihhdXRvICZ6YXAgOiBxbFtha3RsXSl7CiAgICAgICAgICAgICAgICBpbnQgYWt0ciA9IHphcC5yOwogICAgICAgICAgICAgICAgbGwgczEgPSBxdWVyeSgyICogYWt0bCwgYWt0bCArIGFrdHIsIDApOwogICAgICAgICAgICAgICAgbGwgczJjID0gcXVlcnkoMiAqIGFrdGwsIGFrdGwgKyBha3RyLCAxKTsKICAgICAgICAgICAgICAgIGxsIHMyY250ID0gcXVlcnkoMiAqIGFrdGwsIGFrdGwgKyBha3RyLCAyKTsKCiAgICAgICAgICAgICAgICB3eW5bemFwLmluZF0gKz0gczEgKyBzMmMgLSAxbGwgKiBha3RsICogczJjbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgdmVjdG9yPHZpPiBlcihuICsgMSk7CiAgICAKICAgIGZvcihpbnQgaSA9IDA7IGkgPCAyICogTjsgaSsrKXsKICAgIAl0cmVlW2ldWzBdID0gMDsgdHJlZVtpXVsxXSA9IDA7IHRyZWVbaV1bMl0gPSAwOwogICAgfQoKICAgIGZvcihpbnQgeCA9IDI7IHggPD0gMiAqIG47IHgrKyl7CiAgICAgICAgdXBkKHgsIGNyW3hdIC0gMSwgMSk7CiAgICAgICAgdXBkKHgsIDEsIDIpOwoKICAgICAgICBpbnQgdHIgPSBncnJbeF0gLSAxOwogICAgICAgIGlmKHRyIDwgMCkgdHIgPSAwOwogICAgICAgIGlmKHRyIDw9IG4pIGVyW3RyXS5wYih4KTsKICAgIH0KCiAgICBmb3IoaW50IGFrdHIgPSAwOyBha3RyIDw9IG47IGFrdHIrKyl7CiAgICAgICAgZm9yKGludCB4IDogZXJbYWt0cl0pewogICAgICAgICAgICB1cGQoeCwgLShjclt4XSAtIDEpLCAxKTsKICAgICAgICAgICAgdXBkKHgsIC0xLCAyKTsKICAgICAgICAgICAgdXBkKHgsIHByW3hdLCAwKTsKICAgICAgICB9CgogICAgICAgIGlmKGFrdHIgPj0gMSl7CiAgICAgICAgICAgIGZvcihhdXRvICZ6YXAgOiBxcltha3RyXSl7CiAgICAgICAgICAgICAgICBpbnQgYWt0bCA9IHphcC5sOwogICAgICAgICAgICAgICAgbGwgczEgPSBxdWVyeShha3RsICsgYWt0ciArIDEsIDIgKiBha3RyLCAwKTsKICAgICAgICAgICAgICAgIGxsIHMyYyA9IHF1ZXJ5KGFrdGwgKyBha3RyICsgMSwgMiAqIGFrdHIsIDEpOwogICAgICAgICAgICAgICAgbGwgczJjbnQgPSBxdWVyeShha3RsICsgYWt0ciArIDEsIDIgKiBha3RyLCAyKTsKCiAgICAgICAgICAgICAgICB3eW5bemFwLmluZF0gKz0gczEgKyAxTEwgKiBha3RyICogczJjbnQgLSBzMmM7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZm9yKGludCBpID0gMDsgaSA8IHE7IGkrKyl7CiAgICAgICAgY291dCA8PCB3eW5baV0gPDwgIlxuIjsKICAgIH0KCiAgICByZXR1cm4gMDsKfQ==