#include using namespace std; typedef pair pii; const int MAXN = 100005; const int MAXL = 22; int n ,stp,mv,suffix[MAXN],tmp[MAXN]; int sum[MAXN],cnt[MAXN],Rank[MAXL][MAXN]; char str[MAXN]; struct node{ int start,len; }A[4*MAXN],q; int B[4*MAXN]; int LCP(int u,int v){ int ret=0,i; for(i = stp; i >= 0; i--){ if(Rank[i][u]==Rank[i][v]){ ret += 1<A[idx].len || A[2*idx].len == A[idx].len && Rank[stp][A[2*idx].start] > Rank[stp][A[idx].start]){ A[2*idx] = A[idx]; } if(A[2*idx + 1].len>A[idx].len || A[2*idx + 1].len == A[idx].len && Rank[stp][A[2*idx + 1].start] > Rank[stp][A[idx].start]){ A[2*idx + 1] = A[idx]; } A[idx].len = 2*MAXN; } if(B[idx]!=-1){ if(B[2*idx]=rt){ if(A[idx].len>y - x + 1 || A[idx].len==y - x + 1 && Rank[stp][A[idx].start]>Rank[stp][x]){ A[idx].start = x; A[idx].len = y - x + 1; } return; } push(idx); int mid = (lf + rt) / 2; if(x<=mid) tree_update1(2*idx,lf,mid,x,y); if(y>mid) tree_update1(2*idx+1,mid+1,rt,x,y); } void tree_update2(int idx,int lf,int rt,int x,int y,int st){ if(x>y) return; if(x<=lf && y>=rt){ if(B[idx] == -1 || B[idx]mid) tree_update2(2*idx+1,mid+1,rt,x,y,st); } void query(int idx,int lf,int rt,int x){ if(lf == rt){ int len = B[idx]; if(len != -1) len = x - len + 1; else len = 2*MAXN; if(len == A[idx].len){ if(Rank[stp][B[idx]]