Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define gc c=getchar()
- #define r(x) read(x)
- #define ll long long
- template<typename T>
- inline void read(T&x){
- char gc;x=0;
- while(!isdigit(c))gc;
- while(isdigit(c))x=x*10+c-'0',gc;
- }
- const int N=4e5+7;
- char s[N];
- int pos[N];
- int G[N][26];
- int tot;
- int len[N],trans[N][26],fa[N];
- int cnt[N],ord[N];
- ll siz[N];
- ll sum[N];
- inline int Extend(int u,int c,int id){
- int t=++tot;
- siz[t]=1;
- len[t]=len[u]+1;
- pos[t]=id;
- while(u&&!trans[u][c])trans[u][c]=t,u=fa[u];
- if(!u){
- fa[t]=1;
- return t;
- }
- int v=trans[u][c];
- if(len[v]==len[u]+1){
- fa[t]=v;
- return t;
- }
- int x=++tot;
- fa[x]=fa[v];
- len[x]=len[u]+1;
- pos[x]=pos[v];
- memcpy(trans[x],trans[v],26<<2);
- fa[v]=fa[t]=x;
- while(u&&trans[u][c]==v)trans[u][c]=x,u=fa[u];
- return t;
- }
- int dfn;
- int ptn[N];
- void dfs(int x){
- ptn[++dfn]=x;
- sum[dfn]=siz[x]*(len[x]+len[fa[x]]+1)*(len[x]-len[fa[x]])/2;
- for(int i=0;i<26;++i)if(G[x][i])dfs(G[x][i]);
- }
- inline char query(ll k){
- int l=1,r=tot,ans;
- while(l<=r){
- int mid=(l+r)>>1;
- if(sum[mid]<k)ans=mid,l=mid+1;
- else r=mid-1;
- }
- k-=sum[ans];
- int x=ptn[ans+1];
- l=len[fa[x]],r=len[x];
- while(l<=r){
- int mid=(l+r)>>1;
- if(siz[x]*(mid+len[fa[x]]+1)*(mid-len[fa[x]])/2<k)ans=mid,l=mid+1;
- else r=mid-1;
- }
- k-=siz[x]*(ans+len[fa[x]]+1)*(ans-len[fa[x]])/2;
- k=(k-1)%(ans+1)+1;
- return s[pos[x]+k-1];
- }
- int main(){
- scanf("%s",s+1);
- int n=strlen(s+1);
- int lst=++tot;
- for(int i=n;i>=1;--i){
- lst=Extend(lst,s[i]-'a',i);
- }
- for(int i=1;i<=tot;++i)cnt[len[i]]++;
- for(int i=1;i<=n;++i)cnt[i]+=cnt[i-1];
- for(int i=1;i<=tot;++i)ord[cnt[len[i]]--]=i;
- for(int i=tot;i>=1;--i)siz[fa[ord[i]]]+=siz[ord[i]];
- for(int i=1;i<=tot;++i)G[fa[i]][s[pos[i]+len[fa[i]]]-'a']=i;
- dfs(1);
- for(int i=1;i<=tot;++i)sum[i]+=sum[i-1];
- int q;r(q);
- ll g=0;
- while(q--){
- ll p,m;r(p),r(m);
- p=p*g%m;
- char t=query(p+1);
- g+=t;
- // int k;r(k);
- // char t=query(k+1);
- printf("%c\n",t);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment