#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){ dp.clear(); N=1; while(N0){ k=(k-1)/2; dp[k]=mul(dp[k*2+1],dp[k*2+2]); } } mat query(int a,int b,int k=0,int l=0,int r=N){ 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 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;i