This documentation is automatically generated by online-judge-tools/verification-helper
View the Project on GitHub ttamx/cp-library
#define PROBLEM "https://judge.yosupo.jp/problem/persistent_queue" #include "template.hpp" #include "data-structure/persistent-queue.hpp" int main(){ cin.tie(nullptr)->sync_with_stdio(false); int n; cin >> n; PersistentQueue<int> q; for(int i=0;i<n;i++){ int op,t; cin >> op >> t; if(op==0){ int x; cin >> x; q.push(t,x); }else{ cout << q.front(t) << "\n"; q.pop(t); } } }
#line 1 "verify/yosupo/data-structure/persistent_queue.test.cpp" #define PROBLEM "https://judge.yosupo.jp/problem/persistent_queue" #line 1 "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/persistent-queue.hpp" /** * Author: Teetat T. * Date: 2024-06-28 * Description: Persistent Queue. */ template<class T> struct PersistentQueue{ int n,lg; vector<T> dat; vector<int> back_id,len; vector<vector<int>> par; PersistentQueue():n(1),lg(1),dat(0),back_id(0),len(0),par(1,{0}){} void calc_par(){ if(n<(1<<lg))return; for(int i=0;i<n;i++)par[i].emplace_back(par[par[i][lg-1]][lg-1]); lg++; } int push(int t,const T &val){ dat.emplace_back(val); back_id.emplace_back(n); len.emplace_back((t==-1?0:len[t])+1); par.emplace_back(vector<int>(lg,0)); par[n][0]=t==-1?0:back_id[t]; for(int i=1;i<lg;i++)par[n][i]=par[par[n][i-1]][i-1]; n++; calc_par(); return back_id.size()-1; } int pop(int t){ back_id.emplace_back(back_id[t]); len.emplace_back(len[t]-1); return back_id.size()-1; } T front(int t){ int d=size(t)-1; int x=back_id[t]; for(int j=lg-1;j>=0;j--)if(d>>j&1)x=par[x][j]; return dat[x-1]; } int size(int t){ return len[t]; } }; #line 4 "verify/yosupo/data-structure/persistent_queue.test.cpp" int main(){ cin.tie(nullptr)->sync_with_stdio(false); int n; cin >> n; PersistentQueue<int> q; for(int i=0;i<n;i++){ int op,t; cin >> op >> t; if(op==0){ int x; cin >> x; q.push(t,x); }else{ cout << q.front(t) << "\n"; q.pop(t); } } }