题目描述
初始有 n 个顶点,没有边。每条被加入的边上都写着一个整数 ci。
对于同一个连通块内的两个顶点 a 和 b,定义它们之间的简单路径为从 a 到 b 的最短路径。若一条简单路径上,每一种数值的出现次数都是偶数,则称这条路径是 好的。
你需要回答 q 次询问,询问共有 4 种类型:
- 1 u v c(1≤c≤4⋅109):加入一条连接顶点 u 和 v、边权为 c 的边;
- 2 u v:判断顶点 u 和 v 之间的简单路径是否是好的。如果它们之间不存在路径,输出 −1;
- 3 u:输出满足下列条件的点对 (a,b) 的数量:1≤a<b≤n,a 和 b 与 u 属于同一个连通块,并且 a 到 b 的路径是好的;
- 4:输出满足下列条件的点对 (a,b) 的数量:1≤a<b≤n,a 到 b 的路径是好的,并且 a 到 b 存在路径。
保证所有类型 1 的询问中,加入的边都会连接两个不同的连通块。
输入格式
第一行包含两个整数 n(1≤n≤2⋅105)和 q(1≤q≤2⋅105),分别表示顶点数和询问数。
接下来 q 行,每行包含一条询问的描述。每条询问的第一个整数 ti 表示询问类型。
- 若 ti=1,后面跟着 3 个整数 u,v,c(1≤u=v≤n,1≤c≤4⋅109);
- 若 ti=2,后面跟着 2 个整数 u,v(1≤u,v≤n);
- 若 ti=3,后面跟着 1 个整数 u(1≤u≤n);
- 若 ti=4,后面不再跟随其他整数。
输出格式
对于每个类型 2 的询问,输出:
-1:如果当前不存在对应的简单路径;
YES:如果这条简单路径是 好的;
NO:否则。
对于每个类型 3 或类型 4 的询问,输出一个整数,表示对应询问的答案。
你需要按照输入中询问出现的顺序依次回答。
输入 #1
5 11
1 1 2 1
2 1 3
1 2 3 1
3 2
2 1 2
1 2 4 2
1 2 5 2
3 3
2 4 5
2 1 4
4
输出 #1
-1
1
NO
2
YES
NO
2
子任务
- (5 分)对所有 ti=1 的询问,均有 ui=1;
- (5 分)n,q≤20;
- (7 分)n,q≤1000;
- (3 分)ti≤ti+1,ti≤2,c=1;
- (6 分)ti≤ti+1,ti≤2,c≤8;
- (11 分)ti≤ti+1,ti≤2;
- (9 分)q=n,对 1≤i<n 有 ti=1,且 tq=4;
- (17 分)存在一个整数 e,使得对所有 1≤i≤e 都有 ti=1,并且对所有 e<j≤q 都有 tj=1;
- (9 分)c≤1000,图和测试数据随机生成。具体而言,对每个顶点 v(2≤v≤n)随机选择 pv(1≤pv<v),然后生成一个随机排列 perm,并令 v=permv,pv=permpv。询问类型随机选择(如果没有边可加,则不会选择第一类询问),询问中的所有值也随机选取;
- (28 分)无额外限制。