#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdlib>
#define FUP(i,x,y) for(int i=(x);i<=(y);i++)
#define FDW(i,x,y) for(int i=(x);i>=(y);i--)
#define MAXN 200010
#define INF 0x3f3f3f3f
#define MOD 1000000007
#define ll long long
#define db double
using namespace std;
int read()
{
	int d=0,flg=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-'){flg=-1;}ch=getchar();}
	while(ch<='9'&&ch>='0'){d=d*10-'0'+ch,ch=getchar();}
	return d*flg;
}
int n,q,C,opt,x,y,root[MAXN];
int tot;
struct node{
	int ls,rs,val;
}p[MAXN*50];
int Merge(int u,int v,int l,int r)
{
	if(!u||!v) return u|v;
	if(l==r)
	{
		p[++tot].val=p[u].val+p[v].val;
		return tot;
	}
	int mid=(l+r)>>1;
	int node=++tot;
	p[node].ls=Merge(p[u].ls,p[v].ls,l,mid);
	p[node].rs=Merge(p[u].rs,p[v].rs,mid+1,r);
	p[node].val=p[p[node].ls].val+p[p[node].rs].val;
	//printf("%d %d %d %d %d %d\n",node,u,v,p[node].ls,p[node].rs,p[node].val);
	return node;
}
int query(int u,int l,int r,int pos)
{
	if(l==r) return p[u].val;
	int mid=(l+r)>>1;
	if(pos<=mid)
	{
		if(!p[u].ls) return 0;
		return query(p[u].ls,l,mid,pos);
	}
	else
	{
		if(!p[u].rs) return 0;
		return query(p[u].rs,mid+1,r,pos);
	}
}
void update(int u,int l,int r,int x,int y)
{
	if(l==r) p[u].val+=y;
	else
	{
		int mid=(l+r)>>1;
		if(x<=mid)
		{
			if(!p[u].ls) p[u].ls=++tot;
			update(p[u].ls,l,mid,x,y);
		}
		else
		{
			if(!p[u].rs) p[u].rs=++tot;
			update(p[u].rs,mid+1,r,x,y);
		}
		p[u].val=p[p[u].ls].val+p[p[u].rs].val;
	}
}
int fa[MAXN];
int Find(int u){return fa[u]==0?u:fa[u]=Find(fa[u]);}
void Union(int u,int v)
{
	u=Find(u),v=Find(v);
	if(u==v) return;
	fa[u]=v;
	root[v]=Merge(root[u],root[v],1,n);
	//printf("%d\n",root[v]);
}
int main(){
	n=read(),q=read();
	FUP(i,1,n)
	{
		C=read(),root[i]=++tot;
		update(tot,1,n,C,1);
	}
	//printf("## %d\n",tot);
	FUP(i,1,q)
	{
		opt=read(),x=read(),y=read();
		if(opt==1) Union(x,y);
		else
		{
			x=root[Find(x)];
			printf("%d\n",query(x,1,n,y));
		}
	}
	return 0;
}
//*
#pragma GCC target("avx2")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
//*/

#include <bits/stdc++.h>

// #include <atcoder/all>

using namespace std;
// using namespace atcoder;

#define DEBUG(x) cerr<<#x<<": "<<x<<endl;
#define DEBUG_VEC(v) cerr<<#v<<":";for(int i=0;i<v.size();i++) cerr<<" "<<v[i]; cerr<<endl;
#define DEBUG_MAT(v) cerr<<#v<<endl;for(int i=0;i<v.size();i++){for(int j=0;j<v[i].size();j++) {cerr<<v[i][j]<<" ";}cerr<<endl;}
typedef long long ll;
// #define int ll
 
#define vi vector<int>
#define vl vector<ll>
#define vii vector< vector<int> >
#define vll vector< vector<ll> >
#define vs vector<string>
#define pii pair<int,int>
#define pis pair<int,string>
#define psi pair<string,int>
#define pll pair<ll,ll>
template<class S, class T> pair<S, T> operator+(const pair<S, T> &s, const pair<S, T> &t) { return pair<S, T>(s.first + t.first, s.second + t.second); }
template<class S, class T> pair<S, T> operator-(const pair<S, T> &s, const pair<S, T> &t) { return pair<S, T>(s.first - t.first, s.second - t.second); }
template<class S, class T> ostream& operator<<(ostream& os, pair<S, T> p) { os << "(" << p.first << ", " << p.second << ")"; return os; }
#define X first
#define Y second
#define rep(i,n) for(int i=0;i<(int)(n);i++)
#define rep1(i,n) for(int i=1;i<=(int)(n);i++)
#define rrep(i,n) for(int i=(int)(n)-1;i>=0;i--)
#define rrep1(i,n) for(int i=(int)(n);i>0;i--)
#define REP(i,a,b) for(int i=a;i<b;i++)
#define in(x, a, b) (a <= x && x < b)
#define all(c) c.begin(),c.end()
void YES(bool t=true) {cout<<(t?"YES":"NO")<<endl;}
void Yes(bool t=true) {cout<<(t?"Yes":"No")<<endl;}
void yes(bool t=true) {cout<<(t?"yes":"no")<<endl;}
void NO(bool t=true) {cout<<(t?"NO":"YES")<<endl;}
void No(bool t=true) {cout<<(t?"No":"Yes")<<endl;}
void no(bool t=true) {cout<<(t?"no":"yes")<<endl;}
template<class T> bool chmax(T &a, const T &b) { if (a<b) { a = b; return 1; } return 0; }
template<class T> bool chmin(T &a, const T &b) { if (a>b) { a = b; return 1; } return 0; }
#define UNIQUE(v) v.erase(std::unique(v.begin(), v.end()), v.end());
const ll inf = 1000000001;
const ll INF = (ll)1e18 + 1;
const long double pi = 3.1415926535897932384626433832795028841971L;
#define Sp(p) cout<<setprecision(25)<< fixed<<p<<endl;
// int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
// int dx2[8] = { 1,1,0,-1,-1,-1,0,1 }, dy2[8] = { 0,1,1,1,0,-1,-1,-1 };
vi dx = {0, 1, 0, -1}, dy = {-1, 0, 1, 0};
// vi dx2 = { 1,1,0,-1,-1,-1,0,1 }, dy2 = { 0,1,1,1,0,-1,-1,-1 };
#define fio() cin.tie(0); ios::sync_with_stdio(false);
const ll MOD = 1000000007;
// const ll MOD = 998244353;
// #define mp make_pair
//#define endl '\n'


vl a;
int n;
map<pll, ll> mp;

ll solve(ll x, int i) {
    if (i == 0) return 1;
    if (x % a[i] == 0) return 1;
    if (mp.count(pll(x, i))) return mp[pll(x, i)];

    ll needed;
    if (x % a[i] == 0) needed = x / a[i];
    else needed = x / a[i] + 1;
    DEBUG(pll(x, i));
    DEBUG(needed);
    ll ans = 0;
    if (i + 1 < n and needed >= a[i + 1] / a[i]) {}
    else {
        ll gyaku = needed * a[i] - x;
        ll ans1 = solve(gyaku, i - 1);
        ans += ans1;
    }
    ans += solve(x - a[i] * (needed - 1), i - 1);
    mp[pll(x, i)] = ans;
    return ans;
}

signed main() {
    fio();

    cin >> n;
    ll x;
    cin >> x;
    a.resize(n);
    rep (i, n) cin >> a[i];
    // a[0] = 1;
    // rep (i, n - 1) a[i + 1] = a[i] * 2;

    ll ans = solve(x, n - 1);

    // for (auto itr = mp.begin(); itr != mp.end(); itr++) {
    //     DEBUG(*itr);
    // }
    cout << ans << endl;
}