#include #define MOD 1000000007 #define MAX 100005 #define ll long long #define slld(t) scanf("%lld",&t) #define sd(t) scanf("%d",&t) #define ss(x) scanf("%s",x) #define pd(t) printf("%d\n",t) #define plld(t) printf("%lld\n",t) #define pii pair #define pll pair #define tr(container,it) for(typeof(container.begin()) it=container.begin();it!=container.end();it++) #define mp(a,b) make_pair(a,b) #define FF first #define SS second #define pb(x) push_back(x) #define vi vector #define vpii vector #define vll vector #define clr(x) memset(x,0,sizeof(x)) using namespace std; #define LG 17 #define SQ 280 const ll INF = (1LL)<<60; ll C[MAX]; vi adj[MAX]; int F[MAX],L[MAX]; int P[LG][MAX]; vi special,first_SN,super_nodes; bool is_special[MAX],is_first_SN[MAX],is_superNode[MAX],vis[MAX]; set > vals[MAX]; int which[MAX],super_par[MAX]; ll add[MAX]; // LCA helpers void preLCA(int N){ int i, j; for (i = 1; i <= N; i++) for (j = 0; 1 << j < N; j++) P[j][i] = -1; for (i = 1; i <= N; i++) P[0][i] = F[i]; for (j = 1; 1 << j < N; j++) for (i = 1; i <= N; i++) if (P[j-1][i] != -1) P[j][i] = P[j - 1][P[j-1][i]]; } int LCA(int p,int q){ int tmp, log, i; if (L[p] < L[q]) tmp = p, p = q, q = tmp; for (log = 1; 1 << log <= L[p]; log++); log--; for (i = log; i >= 0; i--) if (L[p] - (1 << i) >= L[q]) p = P[i][p]; if (p == q) return p; for (i = log; i >= 0; i--) if (P[i][p] != -1 && P[i][p] != P[i][q]) p = P[i][p], q = P[i][q]; return F[p]; } // ENDS void dfs(int node, int par){ if(L[node]%SQ==0){ special.pb(node); is_special[node]=true; } for(int i=0;i= L[l]){ add[which[u]]+=x; u=super_par[which[u]]; }else{ pointAdd(u,x); u=F[u]; } }else{ pointAdd(u,x); u=F[u]; } } } // on node between u and v (inclusive) void update(int u,int v,ll x){ int l = LCA(u,v); updateUP(u,l,x); updateUP(v,l,x); pointAdd(l,x); } ll query(int idx,ll x){ set >::iterator it = vals[idx].lower_bound(mp(x-add[idx],0)); if(it==vals[idx].end()) return INF; ll ret = (*it).FF + add[idx]; return ret; } ll queryUP(int u,int l,ll x){ ll res = INF; while(u!=l){ if(is_superNode[u]){ if(L[super_par[which[u]]] >= L[l]){ res = min(res,query(which[u],x)); u=super_par[which[u]]; }else{ ll t = C[u]+add[which[u]]; if(t>=x) res = min(res,t); u=F[u]; } }else{ ll t = C[u]+(which[u]==-1?0:add[which[u]]); if(t>=x) res = min(res,t); u=F[u]; } } return res; } ll query(int u,int v,ll x){ int l = LCA(u,v); ll res = min(queryUP(u,l,x),queryUP(v,l,x)); ll t = C[l]+(which[l]==-1?0:add[which[l]]); if(t>=x) res = min(res,t); return res; } int main(){ int t;sd(t); while(t--){ int n,q; sd(n);sd(q); for(int i=1;i<=n;i++) slld(C[i]); for(int i=1;i<=n;i++) adj[i].clear(); for(int i=1;i=INF) ans = -1; plld(ans); } } } }