結果

問題 No.3423 Minimum Xor Query
コンテスト
ユーザー Rubikun
提出日時 2026-01-11 15:09:38
言語 C++17
(gcc 15.2.0 + boost 1.89.0)
結果
WA  
実行時間 -
コード長 6,254 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 2,774 ms
コンパイル使用メモリ 237,236 KB
実行使用メモリ 8,492 KB
最終ジャッジ日時 2026-01-11 15:09:52
合計ジャッジ時間 7,840 ms
ジャッジサーバーID
(参考情報)
judge4 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 10 WA * 8
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return true; } return false; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return true; } return false; }
#define vi vector<int>
#define vl vector<ll>
#define vii vector<pair<int,int>>
#define vll vector<pair<ll,ll>>
#define vvi vector<vector<int>>
#define vvl vector<vector<ll>>
#define vvii vector<vector<pair<int,int>>>
#define vvll vector<vector<pair<ll,ll>>>
#define vst vector<string>
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pb push_back
#define all(x) (x).begin(),(x).end()
#define mkunique(x) sort(all(x));(x).erase(unique(all(x)),(x).end())
#define fi first
#define se second
#define mp make_pair
#define si(x) int(x.size())
const int mod=998244353,MAX=300005,INF=15<<26;

//fastset

// https://www.dropbox.com/s/1zxohqaxrb87uft/Gifted_Infants_The_University_of_Tokyo___erated_files-job_14.pdf?dl=0

using uint = unsigned int ; using ll = long long ; using ull = unsigned long long ; template < class T > using V = vector <T>; template < class T > using VV = V <V<T>>;

int popcnt ( uint x ) { return __builtin_popcount(x); } int popcnt ( ull x ) { return __builtin_popcountll(x); } int bsr ( uint x ) { return 31 - __builtin_clz(x); } int bsr ( ull x ) { return 63 - __builtin_clzll(x); } int bsf ( uint x ) { return __builtin_ctz(x); } int bsf ( ull x ) { return __builtin_ctzll(x); }

struct FastSet {
    static constexpr uint B = 64 ;
    int n, lg;
    VV<ull> seg;
    FastSet( int _n) : n(_n) {
        do {
            seg.push_back(V<ull>((_n + B - 1 ) / B));
            _n = (_n + B - 1 ) / B;
        }while (_n > 1 );
        lg = seg.size();
    }
    bool operator []( int i) const {
        return (seg[ 0 ][i / B] >> (i % B) & 1 ) != 0 ;
    }
    void set ( int i) {
        for ( int h = 0 ; h < lg; h++) {
            seg[h][i / B] |= 1ULL << (i % B); i /= B;
        }
    }
    void reset ( int i) {
        for ( int h = 0 ; h < lg; h++) {
            seg[h][i / B] &= ~( 1ULL << (i % B));
            if (seg[h][i / B]) break ;
            i /= B;
        }
    }
    int next ( int i) {
        if (i < 0) i = 0;
        if (i > n) i = n;
        for ( int h = 0 ; h < lg; h++) {
            if (i / B == seg[h].size()) break ;
            ull d = seg[h][i / B] >> (i % B);
            if (!d) {
                i = i / B + 1 ;
                continue ;
            }
            i += bsf(d);
            for ( int g = h - 1 ; g >= 0 ; g--) {
                i *= B; i += bsf(seg[g][i / B]);
            }
            return i;
        }
        return n;
    }
    // i以上
    int prev ( int i) {
        if (i < 0) i = 0;
        if (i > n) i = n;
        i--;
        for ( int h = 0 ; h < lg; h++) {
            if (i == -1 ) break ;
            ull d = seg[h][i / B] << ( 63 - i % 64 );
            if (!d) {
                i = i / B - 1 ;
                continue ;
            }
            i += bsr(d) - (B - 1 );
            for ( int g = h - 1 ; g >= 0 ; g--) {
                i *= B;
                i += bsr(seg[g][i / B]);
            }
            return i;
        }
        return -1 ;
    }
    // i未満
};


int main(){
    
    std::ifstream in("text.txt");
    std::cin.rdbuf(in.rdbuf());
    cin.tie(0);
    ios::sync_with_stdio(false);
    
    const int D=200;
    const int M=1<<20;
    FastSet FS(M);
    vi CN(M);
    
    int N,Q;cin>>N>>Q;
    vi A(N);
    for(int i=0;i<N;i++){
        cin>>A[i];
    }
    vii que(Q);
    for(int q=0;q<Q;q++){
        int t;cin>>t;
        if(t==1){
            int i,x;cin>>i>>x;i--;
            que[q]=mp(i,x);
        }else{
            int x;cin>>x;x--;
            que[q]=mp(x,-1);
        }
    }
    
    vi res(Q,INF);
    
    for(int q=0;q<Q;q+=D){
        vi B=A,skip(N);
        int l=q,rr=min(Q,q+D);
        vii ask;
        for(int i=l;i<rr;i++){
            auto [a,b]=que[i];
            if(b!=-1){
                skip[a]=true;
            }else{
                ask.pb(mp(a,i));
            }
        }
        sort(all(ask));
        
        int la=0,mi=INF;
        for(auto [r,id]:ask){
            while(la<=r){
                if(skip[la]){
                    
                }else{
                    int x=A[la];
                    if(CN[x]) mi=0;
                    else{
                        int s=FS.prev(x);
                        if(s!=-1) chmin(mi,s^x);
                        int t=FS.next(x);
                        if(t!=M) chmin(mi,t^x);
                        FS.set(x);
                        CN[x]=1;
                    }
                }
                la++;
            }
            //cout<<r<<" "<<id<<" "<<mi<<endl;
            int ans=mi;
            for(int t=l;t<id;t++){
                auto [a,b]=que[t];
                if(b!=-1){
                    B[a]=b;
                }
            }
            vii use;
            for(int t=l;t<id;t++){
                auto [a,b]=que[t];
                if(b!=-1&&a<=r){
                    use.pb(mp(B[a],a));
                }
            }
            mkunique(use);
            //for(auto [a,b]:use) cout<<a<<" "<<b<<endl;
            for(int i=0;i+1<si(use);i++) chmin(ans,use[i].fi^use[i+1].fi);
            for(int i=0;i<si(use);i++){
                int x=use[i].fi;
                
                if(CN[x]) ans=0;
                else{
                    int s=FS.prev(x);
                    if(s!=-1) chmin(ans,s^x);
                    int t=FS.next(x);
                    if(t!=M) chmin(ans,t^x);
                }
            }
            
            res[id]=ans;
            
            for(int t=l;t<id;t++){
                auto [a,b]=que[t];
                if(b!=-1){
                    B[a]=A[a];
                }
            }
        }
        
        
        for(int i=0;i<N;i++){
            FS.reset(A[i]);
            CN[A[i]]=0;
        }
        for(int i=l;i<rr;i++){
            auto [a,b]=que[i];
            if(b!=-1){
                A[a]=b;
                FS.reset(A[a]);
                CN[A[a]]=0;
            }
        }
    }
    
    
    for(int i=0;i<Q;i++){
        if(res[i]!=INF) cout<<res[i]<<"\n";
    }
}


0