Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- const int N=110005;
- int n,Q,dfn[N],ed[N];
- vector<pair<int,int> > e[N];
- int fa[N][20],dep[N];
- long long dis[N];
- void dfs(int x){
- dfn[x]=++*dfn;
- for (auto i:e[x])
- if (i.first!=fa[x][0]){
- fa[i.first][0]=x;
- dep[i.first]=dep[x]+1;
- dis[i.first]=dis[x]+i.second;
- dfs(i.first);
- }
- ed[x]=*dfn;
- }
- vector<int> di[N];
- void init(){
- for (int i=1;i<N;i++)
- for (int j=i;j<N;j+=i)
- di[j].push_back(i);
- }
- struct node{
- int x,l,r,id;
- };
- vector<node> op[N];
- long long ans[N];
- const int M=20000005;
- int ls[M],rs[M],S[M],nd;
- int rt[N];
- void change(int &k,int l,int r,int x,int v){
- if (!k) k=++nd; S[k]+=v;
- if (l==r) return;
- int mid=(l+r)/2;
- if (x<=mid) change(ls[k],l,mid,x,v);
- else change(rs[k],mid+1,r,x,v);
- }
- int ask(int k,int l,int r,int x,int y){
- if ((x<=l&&r<=y)||!k) return S[k];
- int mid=(l+r)/2;
- if (y<=mid) return ask(ls[k],l,mid,x,y);
- if (x>mid) return ask(rs[k],mid+1,r,x,y);
- return ask(ls[k],l,mid,x,mid)+ask(rs[k],mid+1,r,mid+1,y);
- }
- void erase(int x,int y){
- for (;x<=n;x+=x&(-x)) rt[x]=0;
- }
- void change(int x,int y,int v){
- //cout<<"C"<<x<<' '<<y<<' '<<v<<endl;
- for (;x<=n;x+=x&(-x)) change(rt[x],1,n,y,v);
- }
- int query(int x,int l,int r){
- //cout<<"Q"<<x<<' '<<l<<' '<<r<<endl;
- int s=0;
- for (;x;x-=x&(-x)) s+=ask(rt[x],1,n,l,r);
- return s;
- }
- void solve(int x){
- for (auto i:op[x])
- if (!i.id){
- change(dfn[i.x],i.l,1);
- change(ed[i.x]+1,i.l,-1);
- }
- else{
- int p=i.x;
- int val=query(dfn[p],i.l,i.r);
- //cout<<val<<endl;
- if (!val){
- ans[i.id]=-1;
- continue;
- }
- for (int j=16;j>=0;j--)
- if (fa[p][j])
- if (query(dfn[fa[p][j]],i.l,i.r)==val)
- p=fa[p][j];
- ans[i.id]=dis[i.x]-dis[p];
- //cout<<i.x<<' '<<p<<' '<<dis[i.x]<<' '<<dis[p]<<endl;
- }
- for (;nd;--nd) ls[nd]=rs[nd]=S[nd]=0;
- for (auto i:op[x])
- if (!i.id){
- erase(dfn[i.x],i.l);
- erase(ed[i.x]+1,i.l);
- }
- }
- int main(){
- init();
- scanf("%d%d",&n,&Q);
- for (int i=1;i<n;i++){
- int x,y,v;
- scanf("%d%d%d",&x,&y,&v);
- e[x].push_back(pair<int,int>(y,v));
- e[y].push_back(pair<int,int>(x,v));
- }
- dfs(1);
- for (int i=1;i<=18;i++)
- for (int j=1;j<=n;j++)
- fa[j][i]=fa[fa[j][i-1]][i-1];
- for (int i=1;i<=Q;i++){
- int tp,a,b,c,d;
- scanf("%d%d%d",&tp,&a,&b);
- if (tp==0){
- for (auto j:di[b])
- op[j].push_back((node){a,b,0,0});
- ans[i]=(-(1ll<<62));
- }
- else{
- scanf("%d%d",&c,&d);
- op[d].push_back((node){a,b,c,i});
- }
- }
- for (int i=1;i<=n;i++)
- solve(i);
- for (int i=1;i<=Q;i++)
- if (ans[i]!=-(1ll<<62))
- if (ans[i]<0) puts("Impossible!");
- else printf("%lld\n",ans[i]);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement