//
d路堆
#ifndef PQI_INCLUDE_H
#define PQI_INCLUDE_H
#include < vector >
using std::vector;
template < class keyType >
class PQi
... {
private:
int d;
int N;
vector<int>p, q;
const vector<keyType>&a;
public:
PQi(int N, const vector<keyType>&a, int d = 3):a(a),p(N+1, 0),
q(N+1, 0),N(0),d(d)...{ }
int empty()const;
void exch(int i, int j);
void fixUp(int k);
void fixDown(int k, int N);
void insert(int v);
int getmin();
void lower(int k);
} ;
#endif
#ifndef PQI_INCLUDE_H
#define PQI_INCLUDE_H
#include < vector >
using std::vector;
template < class keyType >
class PQi
... {
private:
int d;
int N;
vector<int>p, q;
const vector<keyType>&a;
public:
PQi(int N, const vector<keyType>&a, int d = 3):a(a),p(N+1, 0),
q(N+1, 0),N(0),d(d)...{ }
int empty()const;
void exch(int i, int j);
void fixUp(int k);
void fixDown(int k, int N);
void insert(int v);
int getmin();
void lower(int k);
} ;
#endif
#ifndef INSTANCE_PQI_INCLUDE
#define INSTANCE_PQI_INCLUDE
#include " PQi.h "
template < class keyType >
void PQi < keyType > ::exch( int i, int j)
... {
int t = p[i];
p[i] = p[j];
p[j] = t;
q[p[i]] = i;
q[p[j]] = j;
}
template < class keyType >
void PQi < keyType > ::fixUp( int k)
... {
while (k > 1 && a[p[(k+d-2)/d]] > a[p[k]])
...{
exch(k, (k+d-2)/d);
k = (k+d-2)/d;
}
}
template < class keyType >
void PQi < keyType > ::fixDown( int k, int N)
... {
int j;
while((j = d*(k-1) + 2) <= N)
...{
for(int i = j+1; i < j+d && j <= N; i++)
if(a[p[j]] > a[p[i]]) j = i;
if(!(a[p[k]] > a[p[j]])) break;
exch(k, j);
k = j;
}
}
template < class keyType >
void PQi < keyType > ::insert( int v)
... {
p[++N] = v;
q[v] = N;
fixUp(N);
}
template < class keyType >
int PQi < keyType > ::getmin()
... {
exch(1, N);
fixDown(
#define INSTANCE_PQI_INCLUDE
#include " PQi.h "
template < class keyType >
void PQi < keyType > ::exch( int i, int j)
... {
int t = p[i];
p[i] = p[j];
p[j] = t;
q[p[i]] = i;
q[p[j]] = j;
}
template < class keyType >
void PQi < keyType > ::fixUp( int k)
... {
while (k > 1 && a[p[(k+d-2)/d]] > a[p[k]])
...{
exch(k, (k+d-2)/d);
k = (k+d-2)/d;
}
}
template < class keyType >
void PQi < keyType > ::fixDown( int k, int N)
... {
int j;
while((j = d*(k-1) + 2) <= N)
...{
for(int i = j+1; i < j+d && j <= N; i++)
if(a[p[j]] > a[p[i]]) j = i;
if(!(a[p[k]] > a[p[j]])) break;
exch(k, j);
k = j;
}
}
template < class keyType >
void PQi < keyType > ::insert( int v)
... {
p[++N] = v;
q[v] = N;
fixUp(N);
}
template < class keyType >
int PQi < keyType > ::getmin()
... {
exch(1, N);
fixDown(