#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
using namespace std;
const int nx=1e5+5, qx=3e5+5, kx=17;
int n, q, t[qx], u[qx], v[qx], upd[qx], dsu[nx], res[nx], sz[nx], hd[nx], in[nx], cnt, lvl[nx], pa[nx];
vector<int> d[nx];
void dfssz(int u, int p)
{
sz[u]=1;
pa[u]=p;
lvl[u]=lvl[p]+1;
for (auto v:d[u]) if (v!=p) dfssz(v, u), sz[u]+=sz[v];
}
void hld(int u, int p, int h)
{
hd[u]=h;
in[u]=++cnt;
pair<int, int> hv;
for (auto v:d[u]) if (v!=p) hv=max(hv, {sz[v], v});
if (hv.second) hld(hv.second, u, h);
for (auto v:d[u]) if (v!=p&&v!=hv.second&&!in[v]) hld(v, u, v);
}
struct segtree
{
int d[4*nx], lz[4*nx];
void pushlz(int l, int r, int i)
{
if (!lz[i]) return;
d[i]=r-l+1;
if (l!=r) lz[2*i]=1, lz[2*i+1]=1;
lz[i]=0;
}
void update(int l, int r, int i, int ql, int qr)
{
pushlz(l, r, i);
if (qr<l||r<ql||qr<ql||d[i]==r-l+1) return;
if (ql<=l&&r<=qr) return lz[i]=1, pushlz(l, r, i), void();
int md=(l+r)/2;
update(l, md, 2*i, ql, qr);
update(md+1, r, 2*i+1, ql, qr);
d[i]=d[2*i]+d[2*i+1];
}
int query(int l, int r, int i, int ql, int qr)
{
pushlz(l, r, i);
if (qr<l||r<ql||qr<ql) return 0;
if (ql<=l&&r<=qr) return d[i];
int md=(l+r)/2;
return query(l, md, 2*i, ql, qr)+query(md+1, r, 2*i+1, ql, qr);
}
} s;
void update(int u, int p)
{
while (hd[u]!=hd[p])
{
s.update(1, n, 1, in[hd[u]], in[u]);
u=pa[hd[u]];
}
s.update(1, n, 1, in[p]+1, in[u]);
}
int query(int u, int p)
{
int ans=0;
while (hd[u]!=hd[p])
{
ans+=(in[u]-in[hd[u]]+1)-s.query(1, n, 1, in[hd[u]], in[u]);
u=pa[hd[u]];
}
ans+=(in[u]-in[p])-s.query(1, n, 1, in[p]+1, in[u]);
return ans;
}
int lca(int u, int v)
{
while (hd[u]!=hd[v])
{
if (lvl[hd[u]]>lvl[hd[v]]) swap(u, v);
v=pa[hd[v]];
}
if (lvl[u]>lvl[v]) swap(u, v);
return u;
}
int find(int x)
{
if (dsu[x]==x) return x;
return dsu[x]=find(dsu[x]);
}
int main()
{
cin.tie(NULL)->sync_with_stdio(false);
cin>>n>>q;
for (int i=1; i<=n; i++) dsu[i]=i;
for (int i=1; i<=q; i++)
{
cin>>t[i]>>u[i]>>v[i];
if (t[i]==1)
{
res[i]=-2;
if (find(u[i])!=find(v[i])) dsu[find(u[i])]=find(v[i]), d[u[i]].push_back(v[i]), d[v[i]].push_back(u[i]);
else upd[i]=1;
}
else
{
if (find(u[i])!=find(v[i])) res[i]=-1;
}
}
for (int i=1; i<=n; i++) if (!in[i]) dfssz(i, i), hld(i, i, i);
cout<<1/0;
for (int i=1; i<=q; i++)
{
if (t[i]==1)
{
if (upd[i])
{
update(u[i], lca(u[i], v[i]));
update(v[i], lca(u[i], v[i]));
}
}
else
{
if (!res[i])
{
res[i]=query(u[i], lca(u[i], v[i]))+query(v[i], lca(u[i], v[i]));
}
}
}
for (int i=1; i<=q; i++) if (t[i]==2) cout<<res[i]<<'\n';
}
Compilation message (stderr)
road_development.cpp: In function 'int main()':
road_development.cpp:120:12: warning: division by zero [-Wdiv-by-zero]
120 | cout<<1/0;
| ~^~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |