verify/yosupo/data-structure/set_xor_min.test.cpp
Depends on
Code
#define PROBLEM "https://judge.yosupo.jp/problem/set_xor_min"
#include "template.hpp"
#include "data-structure/binary-trie.hpp"
int main (){
cin . tie ( nullptr ) -> sync_with_stdio ( false );
int q ;
cin >> q ;
set < int > s ;
BinaryTrie < 30 > trie ;
while ( q -- ){
int t , x ;
cin >> t >> x ;
if ( t == 0 ){
if ( s . insert ( x ). second ) trie . insert ( x );
} else if ( t == 1 ){
auto it = s . find ( x );
if ( it != s . end ()){
s . erase ( it );
trie . erase ( x );
}
} else {
cout << trie . min ( x ) << " \n " ;
}
}
}
#line 1 "verify/yosupo/data-structure/set_xor_min.test.cpp"
#define PROBLEM "https://judge.yosupo.jp/problem/set_xor_min"
#line 2 "template.hpp"
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std ;
using namespace __gnu_pbds ;
using ll = long long ;
using db = long double ;
using vi = vector < int > ;
using vl = vector < ll > ;
using vd = vector < db > ;
using pii = pair < int , int > ;
using pll = pair < ll , ll > ;
using pdd = pair < db , db > ;
const int INF = INT_MAX / 2 ;
const int MOD = 998244353 ;
const int MOD2 = 1000000007 ;
const ll LINF = LLONG_MAX / 2 ;
const db DINF = numeric_limits < db >:: infinity ();
const db EPS = 1e-9 ;
const db PI = acos ( db ( - 1 ));
template < class T >
using ordered_set = tree < T , null_type , less < T > , rb_tree_tag , tree_order_statistics_node_update > ;
template < class T >
using ordered_multiset = tree < T , null_type , less_equal < T > , rb_tree_tag , tree_order_statistics_node_update > ;
mt19937 rng ( chrono :: steady_clock :: now (). time_since_epoch (). count ());
mt19937_64 rng64 ( chrono :: steady_clock :: now (). time_since_epoch (). count ());
#line 2 "data-structure/binary-trie.hpp"
/**
* Author: Teetat T.
* Date: 2024-06-11
* Description: Binary Trie
*/
template < int BIT , class T = uint32_t , class S = int >
struct BinaryTrie {
struct Node {
array < int , 2 > ch ;
S cnt ;
Node () : ch { - 1 , - 1 }, cnt ( 0 ){}
};
vector < Node > t ;
BinaryTrie () : t { Node ()}{}
int new_node (){
t . emplace_back ( Node ());
return t . size () - 1 ;
}
S size (){
return t [ 0 ]. cnt ;
}
bool empty (){
return size () == 0 ;
}
S get_cnt ( int i ){
return i !=- 1 ? t [ i ]. cnt : S ( 0 );
}
void insert ( T x , S k = 1 ){
int u = 0 ;
t [ u ]. cnt += k ;
for ( int i = BIT - 1 ; i >= 0 ; i -- ){
int v = x >> i & 1 ;
if ( t [ u ]. ch [ v ] ==- 1 ) t [ u ]. ch [ v ] = new_node ();
u = t [ u ]. ch [ v ];
t [ u ]. cnt += k ;
}
}
void erase ( T x , S k = 1 ){
int u = 0 ;
assert ( t [ u ]. cnt >= k );
t [ u ]. cnt -= k ;
for ( int i = BIT - 1 ; i >= 0 ; i -- ){
int v = x >> i & 1 ;
u = t [ u ]. ch [ v ];
assert ( u !=- 1 && t [ u ]. cnt >= k );
t [ u ]. cnt -= k ;
}
}
T kth ( S k , T x = 0 ){
assert ( k < size ());
int u = 0 ;
T res = 0 ;
for ( int i = BIT - 1 ; i >= 0 ; i -- ){
int v = x >> i & 1 ;
if ( k < get_cnt ( t [ u ]. ch [ v ])){
u = t [ u ]. ch [ v ];
} else {
res |= T ( 1 ) << i ;
k -= get_cnt ( t [ u ]. ch [ v ]);
u = t [ u ]. ch [ v ^ 1 ];
}
}
return res ;
}
T min ( T x ){
return kth ( 0 , x );
}
T max ( T x ){
return kth ( size () - 1 , x );
}
};
#line 4 "verify/yosupo/data-structure/set_xor_min.test.cpp"
int main (){
cin . tie ( nullptr ) -> sync_with_stdio ( false );
int q ;
cin >> q ;
set < int > s ;
BinaryTrie < 30 > trie ;
while ( q -- ){
int t , x ;
cin >> t >> x ;
if ( t == 0 ){
if ( s . insert ( x ). second ) trie . insert ( x );
} else if ( t == 1 ){
auto it = s . find ( x );
if ( it != s . end ()){
s . erase ( it );
trie . erase ( x );
}
} else {
cout << trie . min ( x ) << " \n " ;
}
}
}
Back to top page