今天是第三天
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<cmath>
#include<queue>
#include<deque>
using namespace std;
int r[2000101],l[2000101],dis[2000101],fa[2000101];
long long tree[2000100];
int find(int x)
{
if (x==fa[x]) return x;
return fa[x]=find(fa[x]);
}
int MG(int a,int b)
{
if (!a||!b) return b+a;
if (tree[a]<tree[b]||(tree[a]==tree[b]&&a>b)) swap(a,b);
r[a]=MG(r[a],b);
if (dis[l[a]]<dis[r[a]]) swap(l[a],r[a]);
fa[l[a]]=fa[r[a]]=fa[a]=a,dis[a]=dis[r[a]]+1;
return a;
}
void Del(int x)
{
int L=l[x],R=r[x];
fa[L]=L,fa[R]=R;
l[x]=r[x]=dis[x]=0;
MG(MG(L,R),find(x));
return;
}
bool wj[2000100];
int n,m,t,w;
long long k;
int main()
{
scanf("%d%d%d",&t,&w,&k);
while (t--)
{
fa[0]=dis[0]=l[0]=r[0]=0;
memset(wj,0,sizeof(wj));
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++) cin>>tree[i],fa[i]=i,r[i]=l[i]=dis[i]=0;
for (int i=1;i<=m;i++)
{
int opt;
scanf("%d",&opt);
if (opt==2)
{
int x;
scanf("%d",&x);
tree[x]=0;
Del(x);
}
if (opt==3)
{
int x;
long long y;
scanf("%d%lld",&x,&y);
x=find(x);
tree[x]-=tree[x]>y?y:tree[x];
Del(x);
}
if (opt==4)
{
int x,y;
scanf("%d%d",&x,&y);
x=find(x),y=find(y);
if (x!=y) MG(x,y);
}
}
long long ans=0,mx=0;
for (int i=1;i<=n;i++)
{
int z=find(i);
if (wj[z]) continue;
wj[z]=1;
mx=max(mx,tree[z]);
ans+=tree[z];
}
if (w==2) ans-=mx;
if (w==3) ans+=mx;
if (ans==0) cout<<"Gensokyo 0\n";
else if (ans<=k) cout<<"Heaven "<<ans<<endl;
else cout<<"Hell "<<ans<<endl;
}
return 0;
}