评测记录,卡了很久了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=2e5+10;
ll t,n,f[4],d[4],root,cnt;
signed main(){
scanf("%lld",&t);
while(t--){
scanf("%lld",&n);
for(int i=1;i<=3;i++) scanf("%lld",&f[i]);
d[1]=(f[1]+f[3]-f[2])/2;
d[2]=(f[1]+f[2]-f[3])/2;
d[3]=(f[2]+f[3]-f[1])/2;
if(d[1]<0||d[2]<0||d[3]<0||(d[1]+d[2]+d[3])*2!=(f[1]+f[2]+f[3])||(d[1]+d[2]+d[3]+1)>n){
printf("NO\n");
continue;
}
printf("YES\n");
for(int i=1;i<=4;i++){
if(i==4){
root=4,cnt=4;
continue;
}
if(d[i]==0){
root=i,cnt=3;
break;
}
}
for(ll i=1;i<=3;i++){
if(i==root) continue;
if(d[i]==1){
printf("%lld %lld\n",root,i);
continue;
}
printf("%lld %lld\n",root,++cnt);
for(int j=1;j<d[i]-1;j++){
printf("%lld %lld\n",cnt,cnt+1);
cnt++;
}
printf("%lld %lld\n",cnt,i);
}
for(ll j=cnt+1;j<=n;j++){
printf("%lld %lld\n",root,j);
}
}
return 0;
}