#include #include #include using namespace std; using namespace atcoder; using mint = modint998244353; #define rep(i,n) for (int i = 0; i < (n); ++i) #define Inf32 1000000001 #define Inf64 4000000000000000001 int op(int a,int b){ return min(a,b); } int e(){ return Inf32; } int X; bool f(int x){ return x>=X; } using P = pair; P Op(P a,P b){ return make_pair(a.first+b.first,a.second+b.second); } P E(){ return make_pair(0LL,0LL); } P mapping(long long a,P b){ if(a==-1)return b; b.first = a * b.second; return b; } long long composition(long long a,long long b){ if(a==-1)return b; return a; } long long id(){ return -1; } int main(){ int N,Q; cin>>N>>Q; string S; cin>>S; auto sa = suffix_array(S); auto la = lcp_array(S,sa); vector pos(N); rep(i,sa.size())pos[sa[i]] = i; vector sum(N); vector sum2(N-1); rep(i,sa.size()){ sum[i] = N - sa[i]; if(i!=0)sum[i] += sum[i-1]; } rep(i,la.size()){ sum2[i] = la[i]; if(i!=0)sum2[i] += sum2[i-1]; } vector ans(Q); segtree seg(la); vector> qs(N); vector ll(Q),rr(Q); rep(_,Q){ int l,r; cin>>l>>r; l--; int p = pos[l]; qs[p].push_back(_); X = r-l; int lll = seg.min_left(p); if(lll!=0)ans[_] += sum[lll-1]; ll[_] = l; rr[_] = r; } lazy_segtree Seg(N); //rep(i,N)Seg.set(1,make_pair(0LL,1LL)); for(int i=N-1;i>=0;i--){ if(i!=N-1){ int m = la[i]; //cout<1){ int mid = (ok+ng)/2; if(Seg.get(mid).first>m)ok = mid; else ng = mid; } Seg.apply(i+1,ok+1,m); } Seg.set(i,make_pair((long long)N-sa[i],1LL)); rep(j,qs[i].size()){ int ii = qs[i][j]; //cout<1){ int mid = (ok+ng)/2; if(Seg.get(mid).first>=m)ok = mid; else ng = mid; } //cout<