Submission #1328990

#TimeUsernameProblemLanguageResultExecution timeMemory
1328990Faisal_SaqibNekameleoni (COCI15_nekameleoni)C++20
140 / 140
955 ms47924 KiB
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
int n,m,k;
const int N=1e5+100;
ll pw2[60];
int a[N];
struct Data
{
    int ans=1e9;
    vector<pair<ll,int>> pre,suf;
};
Data seg[N<<2];
Data setvalue(ll x,int i)
{
    Data cur;
    if(k==1)cur.ans=1;
    else cur.ans=1e9;
    cur.pre.push_back({pw2[x],i});
    // cout<<"for "<<x<<' '<<i<<' '<<pw2[x]<<endl;
    cur.suf.push_back({pw2[x],i});
    return cur;
}
Data merge(Data a,Data b)
{
    Data cur;
    cur.ans=min(a.ans,b.ans);
    cur.pre=a.pre;
    for(auto [x,i]:b.pre)
    {
        if((cur.pre.back().first&x) == x)
        {
            // alr have this num
        }
        else
        {
            cur.pre.push_back(make_pair(cur.pre.back().first|x,i));
        }
    }
    reverse(begin(a.suf),end(a.suf));
    reverse(begin(b.suf),end(b.suf));
    cur.suf=b.suf;;
    int jp=b.pre.size()-1;
    for(auto [x,i]:a.suf)
    {
        while(jp>0 and (b.pre[jp-1].first|x)==(pw2[k]-1))jp--;
        if((b.pre[jp].first|x)==(pw2[k]-1))
        {
            cur.ans=min(cur.ans,b.pre[jp].second-i+1);
        }

        if((cur.suf.back().first&x) == x)
        {
            // alr have this numbers
        }
        else
        {
            cur.suf.push_back(make_pair(cur.suf.back().first|x,i));
        }
    }
    reverse(begin(cur.suf),end(cur.suf));
    return cur;
}
void build(int l=1,int r=n,int v=1)
{
    if(l==r)
    {
        seg[v]=setvalue(a[l],l);
        return;
    }
    int m=(l+r)>>1,lc=v<<1,rc=lc|1;
    build(l,m,lc);
    build(m+1,r,rc);
    seg[v]=merge(seg[lc],seg[rc]);
}
void update(int i,int l=1,int r=n,int v=1)
{
    if(i<l or r<i)return;
    if(l==r)
    {
        seg[v]=setvalue(a[l],l);
        return;
    }
    int m=(l+r)>>1,lc=v<<1,rc=lc|1;
    update(i,l,m,lc);
    update(i,m+1,r,rc);
    seg[v]=merge(seg[lc],seg[rc]);
    // cout<<"Poco Loco "<<endl;
    // cout<<"At "<<l<<' '<<r<<' '<<v<<endl;
    // cout<<"ans "<<endl;
    // cout<<seg[v].ans<<endl;
    // cout<<"PRE "<<endl;
    // for(auto [x,i]:seg[v].pre)
    // {
    //     cout<<x<<' '<<i<<endl;
    // }
    // cout<<"SUF "<<endl;
    // for(auto [x,i]:seg[v].suf)
    // {
    //     cout<<x<<' '<<i<<endl;
    // }
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    pw2[0]=1;
    for(int i=1;i<60;i++)pw2[i]=pw2[i-1]<<1;
    cin>>n>>k>>m;;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        a[i]--;
    }
    build();
    while(m--)
    {
        ll ty;
        cin>>ty;
        if(ty==1)
        {
            int p,x;
            cin>>p>>x;
            x--;
            a[p]=x;
            update(p);
        }
        else
        {
            int x=seg[1].ans;
            if(x>n)x=-1;
            cout<<x<<endl;
            // exit(0);
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...