#include <cstdio>
#include <algorithm>
using namespace std;
#define int long long
const int MAXN = 100005;
int n, m;
int fth[MAXN], Val[MAXN], Pow[MAXN];
struct Edge {
int to, next;
} edge[MAXN];
int tot = 0, start[MAXN];
struct Leftist_Tree {
int lef, rgh, key, sze, sum, dis;
} tree[MAXN];
int cnt = 0, heap[MAXN];
int root = 1;
int ans[MAXN];
inline void Up_Data(int p) {
tree[p].sum = tree[tree[p].lef].sum + tree[tree[p].rgh].sum + tree[p].key;
tree[p].dis = tree[tree[p].rgh].dis + 1;
tree[p].sze = tree[tree[p].lef].sze + tree[tree[p].rgh].sze + 1;
}
int Match(int x, int y) {
if (x == 0 || y == 0)return x + y;
if (tree[x].key < tree[y].key)swap(x, y);
tree[x].rgh = Match(tree[x].rgh, y);
if (tree[tree[x].lef].dis < tree[tree[x].rgh].dis)swap(tree[x].lef, tree[x].rgh);
Up_Data(x);
return x;
}