提交记录
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e6+5;
struct TREE{int dis,ls,rs,fa,val;}tree[N];
int find(int x){return tree[x].fa=(tree[x].fa^x)?find(tree[x].fa):x;}
#define ls tree[x].ls
#define rs tree[x].rs
int merge(int x,int y)
{
if(x==y||!x||!y) return x|y;
if(tree[x].val<tree[y].val||(tree[x].val==tree[y].val&&x>y)) swap(x,y);
rs=merge(rs,y);
if(tree[ls].dis<tree[rs].dis) swap(ls,rs);
tree[x].dis=tree[rs].dis+1;
return tree[ls].fa=tree[rs].fa=tree[x].fa=x;
}
void push_up(int x)
{
if(!x) return ;
if(tree[ls].dis<tree[rs].dis) swap(ls,rs);
if(tree[x].dis!=tree[rs].dis+1)
{
tree[x].dis=tree[rs].dis+1;
push_up(tree[x].fa);
}
}
inline void update(int x,int w)
{
tree[x].val=w;
int q=tree[ls].fa=ls,p=tree[rs].fa=rs;
tree[x].dis=1;ls=rs=0;push_up(tree[x].fa);
merge(find(x),merge(p,q));
}
#undef ls
#undef rs
int t,w,k;
int n,m;
ll res;int mx;
inline int read(int &x);
int main()
{
read(t);read(w);read(k);
while(t--)
{
read(n);read(m);
for(int i=1;i<=n;++i){read(tree[i].val);tree[i].ls=tree[i].rs=0;tree[i].fa=i;tree[i].dis=1;}
int opt,a,b;
for(int i=1;i<=m;++i)
{
read(opt);
if(opt==2){read(a);update(a,0);}
else if(opt==3){read(a);read(b);a=find(a);update(a,tree[a].val-b);}
else{read(a);read(b);a=find(a);b=find(b);if(a^b) merge(a,b);}
}
res=mx=0;
for(int i=1;i<=n;++i)
if(tree[i].fa==i&&tree[i].val>0) res+=tree[i].val,mx=max(tree[i].val,mx);
if(w==2) res-=mx;
else if(w==3) res+=mx;
if(!res) printf("Gensokyo");
else if(res>k) printf("Hell");
else printf("Heaven");
printf(" %lld\n",res);
}
return 0;
}
inline int read(int &x)
{
char ch=getchar();x=0;
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x;
}