This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define left 2*i+1
#define righ 2*i+2
#define mid (l+r)/2
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const ll maxn=1e5+100;
const ll inf=1e9+10;
const ll mod=1e9+7;
const ll base=27;
ll n,k,m;
ll a[maxn];
ll ans[4*maxn],len[4*maxn];
vector<pair<ll,ll>>suf[4*maxn],pre[4*maxn];
bool check(ll bit){
    return (bit+1==(1ll<<k));
}
void build(ll i,ll l,ll r){
    if(l==r){
        len[i]=1;
        ans[i]=inf;
        pre[i].pb({0,0});
        pre[i].pb({1,1ll<<a[r]});
        suf[i].pb({0,0});
        suf[i].pb({1,1ll<<a[r]});
        return;
    }
    build(left,l,mid);
    build(righ,mid+1,r);
    len[i]=len[left]+len[righ];
    for(auto x:pre[left])pre[i].pb(x);
    ll cur=pre[left].back().second;
    for(auto x:pre[righ]){
        if((x.second|cur)==cur)continue;
        cur|=x.second;
        pre[i].pb({len[left]+x.first,cur});
    }
    for(auto x:suf[righ])suf[i].pb(x);
    cur=suf[righ].back().second;
    for(auto x:suf[left]){
        if((x.second|cur)==cur)continue;
        cur|=x.second;
        suf[i].pb({len[righ]+x.first,cur});
    }
    ll p=pre[righ].size()-1;
    ll s=0;
    ans[i]=inf;
    while(p>=0&&s<suf[left].size()){
        if(check(pre[righ][p].second|suf[left][s].second)){
            ans[i]=min(ans[i],pre[righ][p].first+suf[left][s].first);
            p--;
        }
        else{
            s++;
        }
    }
    ans[i]=min(ans[i],min(ans[left],ans[righ]));
}
void upd(ll i,ll l,ll r,ll id){
    if(r<id||l>id)return;
    if(l==r){
        pre[i].clear();
        suf[i].clear();
        ans[i]=inf;
        pre[i].pb({0,0});
        pre[i].pb({1,1ll<<a[r]});
        suf[i].pb({0,0});
        suf[i].pb({1,1ll<<a[r]});
        return;
    }
    upd(left,l,mid,id);
    upd(righ,mid+1,r,id);
    //len[i]=len[left]+len[righ];
    pre[i].clear();suf[i].clear();
    for(auto x:pre[left])pre[i].pb(x);
    ll cur=pre[left].back().second;
    for(auto x:pre[righ]){
        if((x.second|cur)==cur)continue;
        cur|=x.second;
        pre[i].pb({len[left]+x.first,cur});
    }
    for(auto x:suf[righ])suf[i].pb(x);
    cur=suf[righ].back().second;
    for(auto x:suf[left]){
        if((x.second|cur)==cur)continue;
        cur|=x.second;
        suf[i].pb({len[righ]+x.first,cur});
    }
    ll p=pre[righ].size()-1;
    ll s=0;
    ans[i]=inf;
    while(p>=0&&s<suf[left].size()){
        if(check(pre[righ][p].second|suf[left][s].second)){
            ans[i]=min(ans[i],pre[righ][p].first+suf[left][s].first);
            p--;
        }
        else{
            s++;
        }
    }
    ans[i]=min(ans[i],min(ans[left],ans[righ]));
}
void pnod(int i,int l,int r){
    cout<<"***********************"<<endl;
    cout<<"Node ID: "<<i<<endl;
    cout<<"Node Range: ["<<l<<','<<r<<']'<<endl;
    cout<<"Node len: "<<len[i]<<endl;
    cout<<"Node prefixes:"<<endl;
    for(auto x:pre[i])cout<<"pre len: "<<x.first<<" pre bitmask "<<x.second<<endl;
    cout<<"Node suffixes:"<<endl;
    for(auto x:suf[i])cout<<"suf len: "<<x.first<<" suf bitmask "<<x.second<<endl;
    cout<<"Answer for this node: "<<ans[i]<<endl;
}
void print(int i,int l,int r){
    if(l==r){
        pnod(i,l,r);
        return;
    }
    print(left,l,mid);
    print(righ,mid+1,r);
    pnod(i,l,r);
}
int main()
{
    IOS
    cin>>n>>k>>m;
    for(ll i=0;i<n;i++){
        cin>>a[i];
        a[i]--;
    }
    build(0,0,n-1);
    //print(0,0,n-1);
    while(m--){
        ll t;
        cin>>t;
        if(t==1){
            ll p,val;
            cin>>p>>val;
            p--;val--;
            a[p]=val;
            upd(0,0,n-1,p);
        }
        else{
            if(ans[0]==inf)cout<<-1<<endl;
            else cout<<ans[0]<<endl;
        }
    }
    return 0;
}
Compilation message (stderr)
nekameleoni.cpp: In function 'void build(long long int, long long int, long long int)':
nekameleoni.cpp:57:18: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   57 |     while(p>=0&&s<suf[left].size()){
      |                 ~^~~~~~~~~~~~~~~~~
nekameleoni.cpp: In function 'void upd(long long int, long long int, long long int, long long int)':
nekameleoni.cpp:104:18: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  104 |     while(p>=0&&s<suf[left].size()){
      |                 ~^~~~~~~~~~~~~~~~~| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |