#include #define MOD 1000000007LL using namespace std; typedef long long ll; typedef pair P; ll extgcd(ll a,ll b,ll& x,ll& y){ ll d=a; if(b!=0LL){ d=extgcd(b,a%b,y,x); y-=(a/b)*x; }else{ x=1; y=0; } return d; } ll mod_inverse(ll a,ll m){ ll x,y; extgcd(a,m,x,y); return (m+x%m)%m; } typedef vector vec; typedef vector mat; mat mul(mat A,mat B){ mat C(A.size(),vec(B[0].size())); for(int i=0;i dp; mat ta; segtree(){ ta.push_back(vec()); ta.push_back(vec()); ta[0].resize(2); ta[1].resize(2); ta[0][0]=1; ta[0][1]=0; ta[1][0]=0; ta[1][1]=1; } void init(int n,int qi){ dp.clear(); N[qi]=1; while(N[qi]0){ k=(k-1)/2; dp[k]=mul(dp[k*2+1],dp[k*2+2]); } } mat query(int a,int b,int k,int l,int r){ if(b<=l || r<=a)return ta; if(a<=l && r<=b)return dp[k]; int mid=(l+r)/2; mat vl=query(a,b,k*2+1,l,mid); mat vr=query(a,b,k*2+2,mid,r); return mul(vl,vr); } }; int n,q; mat val[100001]; mat sum[100001]; vector G[100001]; int depth[100001]; int siz[100001]; int hlsize=0; vector hls[100001]; int which[100001][2]; int parent[100001]; segtree seg[100001]; int kouh[100001][2]; int dfs(int v,int p,int c){ depth[v]=c; sum[v]=mul(sum[v],val[v]); int cnt=1; for(int i=0;isiz[b]){ b=G[v][i]; } } } for(int i=0;idepth[kouh[v][1]])v=kouh[v][0]; else v=kouh[v][1]; //printf("%d %d %d\n",v,which[v][0],which[v][1]); seg[which[v][0]].update(which[v][1],which[v][0],C); }else{ int f,t; scanf("%d%d%*c",&f,&t); mat ans(2,vec(2)); ans[0][0]=1; ans[0][1]=0; ans[1][0]=0; ans[1][1]=1; while(which[f][0]!=which[t][0]){ ans=mul(seg[which[t][0]].query(0,which[t][1]+1,0,0,N[which[t][0]]),ans); t=parent[which[t][0]]; //printf("%d ",t); //printf("%lld %lld %lld %lld\n",ans[0][0],ans[0][1],ans[1][0],ans[1][1]); } //sprintf("end\n"); ans=mul(seg[which[f][0]].query(which[f][1]+1,which[t][1]+1,0,0,N[which[f][0]]),ans); //printf("%d %d %d %d\n",which[f][0],which[f][1],which[t][0],which[t][1]); printf("%lld %lld %lld %lld\n",ans[0][0],ans[0][1],ans[1][0],ans[1][1]); } } return 0; }