明天一定调程序
include <bits/stdc++.h>
define int long long
define pii pair<int,int>
define mkp make_pair
define fst first
define scd second
using namespace std;
const int N=1e5+5;
const int inf=0x3f3f3f3f3f3f3f3f;
int n,m;
struct Edge { int u,v,w,id; }e[N];
struct node { int nxt,val,id; };
vector
int fa[N],f[N],ans[N],val[N],idx[N];
struct Segment_Tree
{
struct NODE {
int l,r;
int mn,mx;
int tag,id;
}tr[N<<2];
void push_up(int id) { tr[id].mn=min(tr[id<<1].mn,tr[id<<1|1].mn); tr[id].mx=max(tr[id<<1].mx,tr[id<<1|1].mx); }
void push_down(int id)
{
if (tr[id].taginf) return ;
int ls=id<<1,rs=id<<1|1;
tr[ls].mn=min(tr[ls].mn,tr[id].tag),tr[ls].tag=min(tr[ls].tag,tr[id].tag);
tr[rs].mn=min(tr[rs].mn,tr[id].tag),tr[rs].tag=min(tr[rs].tag,tr[id].tag);
tr[id].tag=inf;
}
void build(int id,int l,int r)
{
tr[id].l=l,tr[id].r=r;
if (lr) { tr[id].mn=tr[id].tag=inf; tr[id].mx=e[val[l]].w; tr[id].id=idx[l]; return ; }
int mid=(l+r)>>1;build(id<<1,l,mid),build(id<<1|1,mid+1,r);push_up(id);
}
void update(int id,int l,int r,int k)
{if (tr[id].l>=l&&tr[id].r<=r) { tr[id].mn=min(tr[id].mn,k); tr[id].tag=min(tr[id].tag,k); return ; }push_down(id);int mid=tr[id].l+tr[id].r>>1;if (mid>=l) update(id<<1,l,r,k);if (mid+1<=r) update(id<<1|1,l,r,k);push_up(id);
}
int query(int id,int l,int r)
{if (tr[id].l>=l&&tr[id].r<=r) return tr[id].mx;push_down(id);int mid=(tr[id].l+tr[id].r)>>1,res=0;if (l>=mid) res=max(res,query(id<<1,l,r));if (mid+1<=r) res=max(res,query(id<<1|1,l,r));return res;
}
void eaea(int id)
{if (tr[id].l==tr[id].r){if (tr[id].mn<=val[tr[id].l]) ans[e[val[tr[id].l]].id]=2;else ans[e[val[tr[id].l]].id]=1;return ;}eaea(id<<1),eaea(id<<1|1);}
}Tr;
bool cmp(Edge x,Edge y) { return x.w<y.w; }
int find_fa(int x) { return fa[x]=(fa[x]==x?x:find_fa(fa[x])); }
void kruskal()
{
for (int i=1;i<=n;i++) fa[i]=i;
sort(e+1,e+1+m,cmp);
int cnt=0;
for (int i=1;i<=m;i++)
{int u=e[i].u,v=e[i].v,w=e[i].w;int fa1=find_fa(u),fa2=find_fa(v);if (fa1==fa2) continue;fa[fa1]=fa2;tr[u].push_back({v,w,i}),tr[v].push_back({u,w,i});f[i]=1,cnt++;if (cnt>=n-1) break;
}
}
int siz[N],dep[N];
pii son[N];
int dfn[N],tme,top[N];
int st[N][20];
void dfs1(int x,int _fa)
{
dep[x]=dep[_fa]+1,siz[x]=1;
fa[x]=st[x][0]=_fa;
int _size=tr[x].size();
for (int i=0;i<_size;i++)
{
int v=tr[x][i].nxt,w=tr[x][i].val;
if (v_fa) continue;
dfs1(v,x);
siz[x]+=siz[v];
son[x]=(siz[son[x].fst]>siz[v]?son[x]:mkp(v,w));
}
}
void dfs2(int x,int _top,int w)
{
top[x]=_top,dfn[x]=++tme,val[tme]=w,idx[tme]=x;
if (son[x].fst) dfs2(son[x].fst,_top,son[x].scd);
int _size=tr[x].size();
for (int i=0;i<_size;i++)
{
int v=tr[x][i].nxt;
if (vfa[x]||vson[x].fst) continue;
dfs2(v,v,tr[x][i].id);
}
}
void init()
{
for (int j=1;j<=17;j++)
for (int i=1;i<=n;i++) st[i][j]=st[st[i][j-1]][j-1];
}
int lca(int x,int y)
{
if (dep[x]<dep[y]) swap(x,y);
int delta=dep[x]<dep[y],lg=0;
while (delta)
{
if (delta&1) x=st[x][lg];
delta>>=1,lg++;
}
if (xy) return x;
for (int i=17;i>=0;i--)
{if (st[x][i]==st[y][i]) continue;x=st[x][i],y=st[y][i];
}
return st[x][0];
}
int query(int x,int y,int w)
{
int res=0;
while (top[x]!=top[y])
{
if (dep[top[x]]<dep[top[y]]) swap(x,y);
res=max(res,Tr.query(1,dfn[top[x]],dfn[x]));
x=fa[top[x]];
}
if (dep[x]<dep[y]) swap(x,y);
res=max(res,Tr.query(1,dfn[y]+1,dfn[x]));
return res;
}
void update(int x,int y,int w)
{
while (top[x]!=top[y])
{
if (dep[top[x]]<dep[top[y]]) swap(x,y);
Tr.update(1,dfn[top[x]],dfn[x],w);
x=fa[top[x]];
}
if (dep[x]<dep[y]) swap(x,y);
Tr.update(1,dfn[y]+1,dfn[x],w);
return ;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m;
for (int i=1;i<=m;i++) { cin>>e[i].u>>e[i].v>>e[i].w; e[i].id=i; }kruskal();
dfs1(1,0),dfs2(1,0,0);
init(),Tr.build(1,1,n);
for (int i=1;i<=m;i++)
{if (f[i]) continue;int u=e[i].u,v=e[i].v,w=e[i].w,l=lca(u,v);if (query(u,v,w)>=w) { ans[e[i].id]=2; update(u,v,w); }else ans[e[i].id]=3;
}
Tr.eaea(1);
for (int i=1;i<=m;i++)
{if (ans[i]==1) cout<<"any"<<"\n";else if (ans[i]==2) cout<<"at least one"<<"\n";else cout<<"none"<<"\n";
}
return 0;
}