include <bits/stdc++.h>
define int long long
using namespace std;
const int N=2e5+5;
int n,m,a[N];
int bx[N],pre[N],lst[N];
set
struct BIT//呃呃呃钦定这个二阶前缀和求对了
{
int tr1[N],tr2[N];//第一个普通f[i]
int lowbit(int x) { return x&-x; }
void add(int x,int y)
{
if (!x) return ;
int yy=(1-x)y;
while (x<=n) { tr1[x]+=y; tr2[x]+=yy; x+=lowbit(x); }
}
int sum(int x)
{
int res1=0,res2=0,k=x;
while (x) { res1+=tr1[x]; res2+=tr2[x]; x-=lowbit(x); }
return res1k+res2;
}
}bt;
signed main()
{
freopen("sequence.in","r",stdin);
freopen("sequence.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);cin>>n>>m;
for (int i=1;i<=n;i++)
{cin>>a[i];pre[i]=bx[a[i]];lst[bx[a[i]]]=i;bx[a[i]]=i;bt.add(i,i-pre[i]);st[a[i]].insert(i);
}
for (int i=1;i<=n;i++) st[a[i]].insert(0),st[a[i]].insert(n+1);int op,x,y,k;
while (m--)
{cin>>op;if (op==1){cin>>x>>y;int res2=*st[y].lower_bound(x),res1=*(--st[y].lower_bound(x));bt.add(lst[x],x-pre[x]);bt.add(x,res1-pre[x]);bt.add(res2,res1-x);pre[lst[x]]=pre[x],lst[pre[x]]=lst[x];pre[x]=res1,lst[x]=res2;pre[res2]=x,lst[res1]=x;st[a[x]].erase(x);st[y].insert(x);a[x]=y;}else{cin>>k;cout<<bt.sum(k)<<"\n";}
}
return 0;
}
/*
5 5
1 2 3 4 5
2 5
1 1 2
2 3
2 4
2 5
*/
include <bits/stdc++.h>
define int long long
using namespace std;
const int N=3e5+5;
const int inf=0x3f3f3f3f3f3f3f3f;
int n,m,a[N];
int f(int p)
{
int cnt=0,l=p,r=p,v=a[p];
while (l!=1||r!=n)
{
bool flag=false;
if (l>1&&a[l-1]<=v) { l--; flag=true; }
if (r<n&&a[r+1]<=v) { r++; flag=true; }
if (!flag) { v=min(a[l-1],a[r+1]); cnt++; }
}
return cnt;
}
signed main()
{
freopen("expand.in","r",stdin);
freopen("expand.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);cin>>n>>m;
for (int i=1;i<=n;i++) cin>>a[i];
a[0]=a[n+1]=inf;int op,x,y;
while (m--)
{cin>>op>>x;if (op==1) swap(a[x],a[x+1]);else{cin>>y;int res=0;for (int i=x;i<=y;i++) res+=f(i);cout<<res<<"\n";}
}
return 0;
}
include <bits/stdc++.h>
define int long long
using namespace std;
const int N=10;
int n,m;
struct node { int u,v,a,b; }e[110];
struct NODE { int u,v,w; }ea[110];
int ans[N];
int fa[N];
bool cmp(NODE x,NODE y) { return x.w<y.w; }
int find_fa(int x)
{
if (fa[x]==x) return x;
return fa[x]=find_fa(fa[x]);
}
int kruskal()
{
for (int i=1;i<=n;i++) fa[i]=i;
sort(ea+1,ea+1+m,cmp);
int res=0,cnt=0;
for (int i=1;i<=m;i++)
{int u=ea[i].u,v=ea[i].v,w=ea[i].w;int fa1=find_fa(u),fa2=find_fa(v);if (fa1==fa2) continue;fa[fa1]=fa2;res+=w,cnt++;if (cnt>=n-1) break;
}
return res;
}
signed main()
{
freopen("mst.in","r",stdin);
freopen("mst.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);cin>>n>>m;
for (int i=1,u,v,a,b;i<=m;i++) cin>>e[i].u>>e[i].v>>e[i].a>>e[i].b;for (int i=0;i<(1<<m);i++)
{int cnt=0;for (int j=1;j<=m;j++){if (i&(1<<(j-1))) { ea[j]={e[j].u,e[j].v,e[j].a};cnt++; }else ea[j]={e[j].u,e[j].v,e[j].b};}ans[cnt]=max(kruskal(),ans[cnt]);
}for (int i=0;i<=m;i++) cout<<ans[i]<<"\n";
return 0;
}