Caisa is now at home and his son has a simple task for him.
Given a rooted tree with n vertices, numbered from 1 to n (vertex 1 is the root). Each vertex of the tree has a value. You should answer qqueries. Each query is one of the following:
- Format of the query is "1 v". Let's write out the sequence of vertices along the path from the root to vertex v: u1, u2, ..., uk (u1 = 1; uk = v). You need to output such a vertex ui that gcd(value of ui, value of v) > 1 and i < k. If there are several possible vertices ui pick the one with maximum value of i. If there is no such vertex output -1.
- Format of the query is "2 v w". You must change the value of vertex v to w.
You are given all the queries, help Caisa to solve the problem.
The first line contains two space-separated integers n, q (1 ≤ n, q ≤ 105).
The second line contains n integers a1, a2, ..., an (1 ≤ ai ≤ 2·106), where ai represent the value of node i.
Each of the next n - 1 lines contains two integers xi and yi (1 ≤ xi, yi ≤ n; xi ≠ yi), denoting the edge of the tree between vertices xiand yi.
Each of the next q lines contains a query in the format that is given above. For each query the following inequalities hold: 1 ≤ v ≤ n and1 ≤ w ≤ 2·106. Note that: there are no more than 50 queries that changes the value of a vertex.
For each query of the first type output the result of the query.
4 6 10 8 4 3 1 2 2 3 3 4 1 1 1 2 1 3 1 4 2 1 9 1 4
-1 1 2 -1 1
#include
#include
#include
#include
using namespace std;
int fa[100010];
int head[100010];
int edge[100010<<1];
int next[100010<<1];
int ww[100010];
int d;
int n;
int q;
void add(int u,int v)
{
edge[d]=v;
next[d]=head[u];
head[u]=d++;
}
void dfs(int u,int pre)
{
fa[u]=pre;
for(int i=head[u];i!=-1;i=next[i])if(edge[i]!=pre)dfs(edge[i],u);
}
int gcd(int a,int b)
{
if(a
1){ maxi=u; break; } u=fa[u]; } return maxi; } int main() { while(scanf("%d%d",&n,&q)!=EOF) { int i; int u,v; memset(head,-1,sizeof(head)); d=0; for(i=1;i<=n;i++)scanf("%d",&ww[i]); for(i=1;i