原題鏈接:Problem - 1899F - Codeforces
題目大意:要求構建出一顆樹,多次詢問樹的葉節點之間的距離有沒有達到要求的距離,如果有直接輸出-1 -1 -1,如果沒有可以斷開一條邊和連上一條邊,輸出x y z,代表斷開x-y,連接x-z。
思路:可以先構建一條鏈,然后移動第一個節點,去構成需要的距離。因為移動了第一個節點,那么第二個節點就變成了葉節點,就需要特判一下第n個節點和第二個節點的距離是否滿足題意。
//冷靜,冷靜,冷靜
//調不出來就重構
#pragma GCC optimize(2)
#pragma GCC optimize("O3")
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<ll,ll> pii;
const int N=1e6+10,mod=998244353;
int main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);ll t;cin>>t;while(t--){ll n,q;cin>>n>>q;for(int i=1;i<n;i++){cout<<i<<' '<<i+1<<endl;//按照題意生成樹 }ll a=0,b=0,c=0;while(q--){ll dist;cin>>dist;if(!a)//對于第一次移動特判一下 {if(dist==n-1){cout<<"-1 -1 -1"<<endl;}else{b=2;c=n-dist+1;a=1;cout<<a<<' '<<b<<' '<<c<<endl;}}else{if(dist==n-2&&c!=2)//當第一個節點不和第二個節點相連接,那么就特判一下第二個節點和第n個節點 {cout<<"-1 -1 -1"<<endl;continue;}ll xa,xb,xc;xa=1,xb=c,xc=n-dist+1;if(xb==xc){cout<<"-1 -1 -1"<<endl;//如果第一個節點沒必要移動 }else{cout<<xa<<' '<<xb<<' '<<xc<<endl;a=xa,b=xb,c=xc;//移動第一個節點 }}}}return 0;
}