//https://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=4001213 //beetさんありがとう #define PROBLEM "http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0425" #include using namespace std; #define call_from_test #ifndef call_from_test #include using namespace std; using Int = long long; #endif //BEGIN CUT HERE struct FastIO{ FastIO(){ cin.tie(0); ios::sync_with_stdio(0); } }fastio_beet; //END CUT HERE #ifndef call_from_test signed main(){ return 0; } #endif #ifndef call_from_test #include using namespace std; #endif //BEGIN CUT HERE struct Mo{ using F = function; vector ls,rs,ord; int n,width,nl,nr,ptr; F expandL,expandR; F shrinkL,shrinkR; Mo(int n,int width,F expandL,F expandR,F shrinkL,F shrinkR): n(n),width(width),nl(0),nr(0),ptr(0), expandL(expandL),expandR(expandR), shrinkL(shrinkL),shrinkR(shrinkR){} Mo(int n,int width,F expand,F shrink){ *this=Mo(n,width,expand,expand,shrink,shrink); } void add(int l,int r){ ls.emplace_back(l); rs.emplace_back(r); } void build(){ ord.resize(ls.size()); iota(ord.begin(),ord.end(),0); sort(ord.begin(),ord.end(), [&](int a,int b){ if(ls[a]/width!=ls[b]/width) return ls[a]ls[idx]) expandL(--nl); while(nrrs[idx]) shrinkR(--nr); return idx; } }; //END CUT HERE #ifndef call_from_test #define call_from_test #include "../math/factorize.cpp" #include "../tools/fastio.cpp" #include "../tools/vec.cpp" #include "../tree/eulertourforedge.cpp" #undef call_from_test //INSERT ABOVE HERE signed DWANGO2017FINAL_B(){ using ll = long long; int n,q; cin>>n>>q; vector x(n); for(int i=0;i>x[i]; const int RT = 40; auto acc=make_v(RT,n+1); fill_v(acc,0); using P = pair; vector > v(n); for(int i=0;i cnt(MAX,0); vector fact(MAX),invs(MAX); fact[0]=1; for(int i=1;i>l>>r; l--; mo.add(l,r); } mo.build(); vector ans(q); for(int i=0;i>n>>q; vector as(n),bs(n),cs(n),ds(n); vector xs(q),ys(q),us(q),vs(q); EulerTourForEdge et(n); for(int i=1;i>as[i]>>bs[i]>>cs[i]>>ds[i]; as[i]--;bs[i]--; et.add_edge(as[i],bs[i]); } et.build(); vector idx(n,0); for(int i=1;i>xs[i]>>ys[i]>>us[i]>>vs[i]; us[i]--;vs[i]--; } int all=0; vector cnt(n),sum(n),app(n,0); auto exec= [&](int k){ int v=et.bottom(k); int e=idx[v]; app[v]^=1; if(app[v]){ all+=ds[e]; cnt[cs[e]]++; sum[cs[e]]+=ds[e]; }else{ all-=ds[e]; cnt[cs[e]]--; sum[cs[e]]-=ds[e]; } }; Mo mo(n*2,400,exec,exec); for(int i=0;i ans(q,0); for(int i=0;i>n>>k>>q; vector as(k),bs(k); for(int i=0;i>as[i]>>bs[i],as[i]--,bs[i]--; vector ord(n),pos(n); iota(ord.begin(),ord.end(),0); iota(pos.begin(),pos.end(),0); auto moveL= [&](int i){ int x=pos[as[i]],y=pos[bs[i]]; swap(ord[x],ord[y]); swap(pos[ord[x]],pos[ord[y]]); }; auto moveR= [&](int i){ int x=as[i],y=bs[i]; swap(ord[x],ord[y]); swap(pos[ord[x]],pos[ord[y]]); }; Mo mo(q,400,moveL,moveR,moveL,moveR); vector qs(q),ls(q),rs(q),xs(q); for(int i=0;i>ls[i]>>rs[i]>>xs[i]; ls[i]--;xs[i]--; mo.add(ls[i],rs[i]); } mo.build(); vector ans(q,-1); for(int i=0;i