#ifndef LOCAL #pragma GCC optimize("O3") #endif #include using namespace std; #define sim template muu & operator<<( #define ris return *this #define eni(r) sim> typename enable_if <1 r sizeof(dud(0)),muu&>::type operator<<(c g) { sim> struct rge {c b,e ;}; sim> rge range(c i, c j) {return rge{i, j};} sim> auto dud(c *r)-> decltype(cerr << *r); sim> char dud(...); struct muu { #ifdef LOCAL stringstream a; ~muu() {cerr << a.str() << endl;} eni(<) a << boolalpha << g; ris;} eni(==) ris << range(begin(g), end(g));} sim, class m mor pair r) {ris << "(" << r.first << ", " << r.second << ")";} sim mor rge u) { a << "["; for (c i = u.b; i != u.e; ++i) *this << ", " + 2 * (i == u.b) << *i; ris << "]"; } #else sim mor const c&) {ris;} #endif muu & operator()(){ris;} }; #define debug (muu() << __FUNCTION__ << "#" << __LINE__ << ": ") #define imie(r) "[" #r ": " << (r) << "] " #define imask(r) "[" #r ": " << bitset<8 * sizeof(r)>(r) << "] " #define arr(a, i) "[" #a imie(i) ": " << a[i] << "] " #define arr2(a, i, j) "[" #a imie(i) imie(j) ": " << a[i][j] << "] " using ll=long long; using vi=vector; using pii=pair; const int n1=(1<<17); const int k=10; const int nax=2*n1+7; const int vax=1e7; int n, q; int typ[nax]; vi zap[nax]; map mapa; int kon[nax]; vector < pair > lacz[nax]; void rzuc(int v, int a, int b, int graa, int grab, pii kogo, int w) { if (a>=graa && b<=grab) { //~ debug() << a << "-" << b << " " << kogo << " " << w; lacz[v].push_back({kogo, w}); return; } if (a>grab || b>1, graa, grab, kogo, w); rzuc((v<<1)^1, (a+b+2)>>1, b, graa, grab, kogo, w); } int oj[k][nax]; int roz[k][nax]; int dlu; int gdz[vax]; int pamkt[vax]; int pamv[vax]; int pamoj[vax]; int pamroz[vax]; int fin(int kt, int v) { if (oj[kt][v]==v) return v; return fin(kt, oj[kt][v]); } int czas; void uni(int kt, int v, int u) { v=fin(kt, v); u=fin(kt, u); if (v==u) return; dlu++; gdz[dlu]=czas; pamkt[dlu]=kt; pamv[dlu]=v; pamoj[dlu]=oj[kt][v]; pamroz[dlu]=roz[kt][v]; dlu++; gdz[dlu]=czas; pamkt[dlu]=kt; pamv[dlu]=u; pamoj[dlu]=oj[kt][u]; pamroz[dlu]=roz[kt][u]; if (roz[kt][v]>1); przejdz((v<<1)^1, (a+b+2)>>1, b); } rollback(v); } int main() { scanf("%d%d", &n, &q); for (int i=1; i<=q; i++) { scanf("%d", &typ[i]); if (typ[i]) { int a, b; scanf("%d%d", &a, &b); a++; b++; if (a>b) swap(a, b); zap[i]={a, b}; } else { int a, b, c; scanf("%d%d%d", &a, &b, &c); a++; b++; if (a>b) swap(a, b); zap[i]={a, b, c}; } } for (int i=1; i<=q; i++) { if (typ[i]==0) { kon[i]=q; mapa[{zap[i][0], zap[i][1]}]=i; } if (typ[i]==1) { kon[mapa[{zap[i][0], zap[i][1]}]]=i; } } for (int i=1; i<=q; i++) { if (typ[i]==0) rzuc(1, 1, n1, i, kon[i], {zap[i][0], zap[i][1]}, zap[i][2]); //~ debug() << i << " " << kon[i]; } for (int i=0; i