// author : prem ktiw
// count no. of different substrings
# include<iostream>
# include<cstdlib>
# include<cstring>
# include<cstdio>
typedef long long int lli;
using namespace std;
namespace SuffixArray{
# define MAX_N 3001
char STR[MAX_N];
int n;
int RA[MAX_N], tRA[MAX_N];
int SA[MAX_N], tSA[MAX_N];
int LCP[MAX_N];
int c[MAX_N];
void countSort(int k) {
int i, sum, maxi = max(300, n);
memset(c, 0, sizeof c);
for (i = 0; i < n; i++)
c[i + k < n ? RA[i + k] : 0]++;
for (i = sum = 0; i < maxi; i++) {
int t = c[i]; c[i] = sum; sum += t;
}
for (i = 0; i < n; i++)
tSA[c[SA[i]+k < n ? RA[SA[i]+k] : 0]++] = SA[i];
for (i = 0; i < n; i++)
SA[i] = tSA[i];
}
void buildSA() {
int i, k, r;
for (i = 0; i < n; i++) RA[i] = STR[i];
for (i = 0; i < n; i++) SA[i] = i;
for (k = 1; k < n; k <<= 1) {
countSort(k);
countSort(0);
tRA[SA[0]] = r = 0;
for (i = 1; i < n; i++)
tRA[SA[i]] =
(RA[SA[i]] == RA[SA[i-1]] && RA[SA[i]+k] == RA[SA[i-1]+k]) ? r : ++r;
for (i = 0; i < n; i++)
RA[i] = tRA[i];
if (RA[SA[n-1]] == n-1) break;
}
}
void buildLCP(){
//for all suffixes starting from location i onwards
for(int i=0,k=0;i<n;++i,k?--k:0){
if(RA[i]==n-1){k==0;continue;} //this is last suffix in SA
int j=SA[RA[i]+1];
while(i+k < n && j+k < n && STR[i+k] == STR[j+k])++k;
LCP[RA[i]] = k;
}
}
// namespace ends
}
using namespace SuffixArray;
lli how_many(int n){
int x = n - SA[0];
lli ans = x ;
for(int i = 0 ; i < n-1; ++i){
x = n - (SA[i+1] + LCP[i]);
ans += x;
}
return ans;
}
int **allot(int n,int m){
int **st = new int*[n+1];
for(int i=0;i<=n;st[i] = new int[m+1](),++i);
return st; }
int main(){
int n,q;
cin>>n>>q;
char *str = new char[n+1]();
int **mat = allot(3000,3000);
cin>>str;
int a,b;
while(q--){
cin>>a>>b;
if(a == b){cout << 1 <<endl;continue;}
if(mat[a][b]){cout<<mat[a][b]<<endl;continue;}
char ch = str[b+1];
str[b+1] = 0;
strcpy(STR,str+a);
str[b+1] = ch;
SuffixArray :: n = b-a+1;
buildSA();
buildLCP();
cout<<(mat[a][b] = how_many(b-a+1))<<endl;
}
return 0;
}
Ly8gYXV0aG9yIDogcHJlbSBrdGl3Ci8vIGNvdW50IG5vLiBvZiBkaWZmZXJlbnQgc3Vic3RyaW5ncwoKIyBpbmNsdWRlPGlvc3RyZWFtPgojIGluY2x1ZGU8Y3N0ZGxpYj4KIyBpbmNsdWRlPGNzdHJpbmc+CiMgaW5jbHVkZTxjc3RkaW8+CgogdHlwZWRlZiBsb25nIGxvbmcgaW50IGxsaTsKCgogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiBuYW1lc3BhY2UgU3VmZml4QXJyYXl7CgojIGRlZmluZSBNQVhfTiAzMDAxCmNoYXIgU1RSW01BWF9OXTsKaW50IG47CmludCBSQVtNQVhfTl0sIHRSQVtNQVhfTl07CmludCBTQVtNQVhfTl0sIHRTQVtNQVhfTl07CmludCBMQ1BbTUFYX05dOwppbnQgY1tNQVhfTl07Cgp2b2lkIGNvdW50U29ydChpbnQgaykgewogIGludCBpLCBzdW0sIG1heGkgPSBtYXgoMzAwLCBuKTsKICBtZW1zZXQoYywgMCwgc2l6ZW9mIGMpOwogIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCiAgICBjW2kgKyBrIDwgbiA/IFJBW2kgKyBrXSA6IDBdKys7CiAgZm9yIChpID0gc3VtID0gMDsgaSA8IG1heGk7IGkrKykgewogICAgaW50IHQgPSBjW2ldOyBjW2ldID0gc3VtOyBzdW0gKz0gdDsKICB9CiAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKICAgIHRTQVtjW1NBW2ldK2sgPCBuID8gUkFbU0FbaV0ra10gOiAwXSsrXSA9IFNBW2ldOwogIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCiAgICBTQVtpXSA9IHRTQVtpXTsKfQoKdm9pZCBidWlsZFNBKCkgewogIGludCBpLCBrLCByOwogIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIFJBW2ldID0gU1RSW2ldOwogIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIFNBW2ldID0gaTsKICBmb3IgKGsgPSAxOyBrIDwgbjsgayA8PD0gMSkgewogICAgY291bnRTb3J0KGspOwogICAgY291bnRTb3J0KDApOwogICAgdFJBW1NBWzBdXSA9IHIgPSAwOwogICAgZm9yIChpID0gMTsgaSA8IG47IGkrKykKICAgICAgdFJBW1NBW2ldXSA9CiAgICAgIChSQVtTQVtpXV0gPT0gUkFbU0FbaS0xXV0gJiYgUkFbU0FbaV0ra10gPT0gUkFbU0FbaS0xXStrXSkgPyByIDogKytyOwogICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKICAgICAgUkFbaV0gPSB0UkFbaV07CiAgICBpZiAoUkFbU0Fbbi0xXV0gPT0gbi0xKSBicmVhazsKICB9Cn0KCgp2b2lkIGJ1aWxkTENQKCl7CgkvL2ZvciBhbGwgc3VmZml4ZXMgc3RhcnRpbmcgZnJvbSBsb2NhdGlvbiBpIG9ud2FyZHMKCWZvcihpbnQgaT0wLGs9MDtpPG47KytpLGs/LS1rOjApewoJCWlmKFJBW2ldPT1uLTEpe2s9PTA7Y29udGludWU7fSAvL3RoaXMgaXMgbGFzdCBzdWZmaXggaW4gU0EKCQlpbnQgaj1TQVtSQVtpXSsxXTsKCQl3aGlsZShpK2sgPCBuICYmIGorayA8IG4gJiYgU1RSW2kra10gPT0gU1RSW2ora10pKytrOwoJCUxDUFtSQVtpXV0gPSBrOwoJfQp9CgovLyBuYW1lc3BhY2UgZW5kcwp9Cgp1c2luZyBuYW1lc3BhY2UgU3VmZml4QXJyYXk7CgogbGxpIGhvd19tYW55KGludCBuKXsKCiAgICBpbnQgeCA9IG4gLSBTQVswXTsKICAgIGxsaSBhbnMgPSB4IDsKCgogICAgZm9yKGludCBpID0gMCA7IGkgPCBuLTE7ICsraSl7CiAgICAgICAgeCA9IG4gLSAoU0FbaSsxXSArIExDUFtpXSk7CiAgICAgICAgYW5zICs9IHg7CiAgICB9CgogICAgcmV0dXJuIGFuczsKIH0KCmludCAqKmFsbG90KGludCBuLGludCBtKXsKaW50ICoqc3QgPSBuZXcgaW50KltuKzFdOwpmb3IoaW50IGk9MDtpPD1uO3N0W2ldID0gbmV3IGludFttKzFdKCksKytpKTsKcmV0dXJuIHN0OyB9CgogaW50IG1haW4oKXsKICAgIGludCBuLHE7CiAgICBjaW4+Pm4+PnE7CgogICAgY2hhciAqc3RyID0gbmV3IGNoYXJbbisxXSgpOwoKICAgIGludCAqKm1hdCA9IGFsbG90KDMwMDAsMzAwMCk7CgoKICAgIGNpbj4+c3RyOwoKICAgIGludCBhLGI7CgogICAgd2hpbGUocS0tKXsKICAgICAgICBjaW4+PmE+PmI7CgogICAgICAgIGlmKGEgPT0gYil7Y291dCA8PCAxIDw8ZW5kbDtjb250aW51ZTt9CiAgICAgICAgaWYobWF0W2FdW2JdKXtjb3V0PDxtYXRbYV1bYl08PGVuZGw7Y29udGludWU7fQoKICAgICAgICBjaGFyIGNoID0gc3RyW2IrMV07CiAgICAgICAgc3RyW2IrMV0gPSAwOwogICAgICAgIHN0cmNweShTVFIsc3RyK2EpOwogICAgICAgIHN0cltiKzFdID0gY2g7CgogICAgICAgIFN1ZmZpeEFycmF5IDo6IG4gPSBiLWErMTsKCiAgICAgICAgYnVpbGRTQSgpOwogICAgICAgIGJ1aWxkTENQKCk7CgoKICAgICAgICBjb3V0PDwobWF0W2FdW2JdID0gaG93X21hbnkoYi1hKzEpKTw8ZW5kbDsKICAgIH0KCgoKIHJldHVybiAwOwogfQo=