#include using namespace std; typedef signed long long ll; #define _P(...) (void)printf(__VA_ARGS__) #define FOR(x,to) for(x=0;x<(to);x++) #define FORR(x,arr) for(auto& x:arr) #define FORR2(x,y,arr) for(auto& [x,y]:arr) #define ALL(a) (a.begin()),(a.end()) #define ZERO(a) memset(a,0,sizeof(a)) #define MINUS(a) memset(a,0xff,sizeof(a)) template bool chmax(T &a, const T &b) { if(a bool chmin(T &a, const T &b) { if(a>b){a=b;return 1;}return 0;} //------------------------------------------------------- int N,Q; string S; template struct SuffixArray { int N; vector rank,lcp,sa,rsa; ST S; SuffixArray(ST S) : S(S){ int i,h=0; vector tmp; N=S.size(); rank.resize(N+1); sa.resize(N+1); tmp.resize(N+1); FOR(i,N+1) sa[i]=i, rank[i]=i==N?-1:S[i]; for(int k=1; k<=N; k<<=1) { auto pred2 = [k,this](int& a,int &b)->bool{ return (((a+k<=N)?rank[a+k]:-1)<((b+k<=N)?rank[b+k]:-1));}; auto pred = [pred2,k,this](int& a,int &b)->bool{ return (rank[a]!=rank[b])?(rank[a] class SegTree_1 { public: vector val; static V const def=1<<20; V comp(V l,V r){ return min(l,r);}; SegTree_1(){val=vector(NV*2,0);}; V getval(int x,int y,int l=0,int r=NV,int k=1) { // x<=i1) entry>>=1, val[entry]=comp(val[entry*2],val[entry*2+1]); } }; SegTree_1 st; ll preS[202020],sufS[202020]; void solve() { int i,j,k,l,r,x,y; string s; cin>>N>>Q>>S; SuffixArray sa(S); FOR(i,N) { preS[i]=(N-sa.sa[i]); if(i) preS[i]+=preS[i-1]; st.update(i,sa.lcp[i]); } vector> V={}; ll sum=0; for(i=N;i>=0;i--) { x=N-sa.sa[i]; y=sa.lcp[i]; k=0; while(V.size()&&V.back().first>=y) { sum-=1LL*(V.back().first-y)*V.back().second; k+=V.back().second; V.pop_back(); } if(k) V.push_back({y,k}); sum+=x; V.push_back({x,1}); sufS[i]=sum; } while(Q--) { int L,R; cin>>L>>R; int P=sa.rsa[L-1]; L=R-L+1; int X=P,Y=P; for(i=20;i>=0;i--) { if(X-(1<=0&&st.getval(X-(1<=L) X-=1<=L) Y+=1<