QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#310398#8133. When Anton Saw This Task He Reacted With 😩ucup-team112AC ✓432ms97652kbC++2029.2kb2024-01-21 12:22:262024-01-21 12:22:26

Judging History

你现在查看的是最新测评结果

  • [2024-01-21 12:22:26]
  • 评测
  • 测评结果:AC
  • 用时:432ms
  • 内存:97652kb
  • [2024-01-21 12:22:26]
  • 提交

answer

//#define _GLIBCXX_DEBUG

//#pragma GCC target("avx2")
//#pragma GCC optimize("O3")
//#pragma GCC optimize("unroll-loops")

#include<bits/stdc++.h>
using namespace std;


#ifdef LOCAL
#include <debug_print.hpp>
#define OUT(...) debug_print::multi_print(#__VA_ARGS__, __VA_ARGS__)
#else
#define OUT(...) (static_cast<void>(0))
#endif

#define endl '\n'
#define lfs cout<<fixed<<setprecision(15)
#define ALL(a)  (a).begin(),(a).end()
#define ALLR(a)  (a).rbegin(),(a).rend()
#define UNIQUE(a) (a).erase(unique((a).begin(),(a).end()),(a).end())
#define spa << " " <<
#define fi first
#define se second
#define MP make_pair
#define MT make_tuple
#define PB push_back
#define EB emplace_back
#define rep(i,n,m) for(ll i = (n); i < (ll)(m); i++)
#define rrep(i,n,m) for(ll i = (ll)(m) - 1; i >= (ll)(n); i--)
using ll = long long;
using ld = long double;
const ll MOD1 = 1e9+7;
const ll MOD9 = 998244353;
const ll INF = 1e18;
using P = pair<ll, ll>;
template<typename T> using PQ = priority_queue<T>;
template<typename T> using QP = priority_queue<T,vector<T>,greater<T>>;
template<typename T1, typename T2>bool chmin(T1 &a,T2 b){if(a>b){a=b;return true;}else return false;}
template<typename T1, typename T2>bool chmax(T1 &a,T2 b){if(a<b){a=b;return true;}else return false;}
ll median(ll a,ll b, ll c){return a+b+c-max({a,b,c})-min({a,b,c});}
void ans1(bool x){if(x) cout<<"Yes"<<endl;else cout<<"No"<<endl;}
void ans2(bool x){if(x) cout<<"YES"<<endl;else cout<<"NO"<<endl;}
void ans3(bool x){if(x) cout<<"Yay!"<<endl;else cout<<":("<<endl;}
template<typename T1,typename T2>void ans(bool x,T1 y,T2 z){if(x)cout<<y<<endl;else cout<<z<<endl;}  
template<typename T1,typename T2,typename T3>void anss(T1 x,T2 y,T3 z){ans(x!=y,x,z);};  
template<typename T>void debug(const T &v,ll h,ll w,string sv=" "){for(ll i=0;i<h;i++){cout<<v[i][0];for(ll j=1;j<w;j++)cout<<sv<<v[i][j];cout<<endl;}};
template<typename T>void debug(const T &v,ll n,string sv=" "){if(n!=0)cout<<v[0];for(ll i=1;i<n;i++)cout<<sv<<v[i];cout<<endl;};
template<typename T>void debug(const vector<T>&v){debug(v,v.size());}
template<typename T>void debug(const vector<vector<T>>&v){for(auto &vv:v)debug(vv,vv.size());}
template<typename T>void debug(stack<T> st){while(!st.empty()){cout<<st.top()<<" ";st.pop();}cout<<endl;}
template<typename T>void debug(queue<T> st){while(!st.empty()){cout<<st.front()<<" ";st.pop();}cout<<endl;}
template<typename T>void debug(deque<T> st){while(!st.empty()){cout<<st.front()<<" ";st.pop_front();}cout<<endl;}
template<typename T>void debug(PQ<T> st){while(!st.empty()){cout<<st.top()<<" ";st.pop();}cout<<endl;}
template<typename T>void debug(QP<T> st){while(!st.empty()){cout<<st.top()<<" ";st.pop();}cout<<endl;}
template<typename T>void debug(const set<T>&v){for(auto z:v)cout<<z<<" ";cout<<endl;}
template<typename T>void debug(const multiset<T>&v){for(auto z:v)cout<<z<<" ";cout<<endl;}
template<typename T,size_t size>void debug(const array<T, size> &a){for(auto z:a)cout<<z<<" ";cout<<endl;}
template<typename T,typename V>void debug(const map<T,V>&v){for(auto z:v)cout<<"["<<z.first<<"]="<<z.second<<",";cout<<endl;}
template<typename T>vector<vector<T>>vec(ll x, ll y, T w){vector<vector<T>>v(x,vector<T>(y,w));return v;}
vector<ll>dx={1,-1,0,0,1,1,-1,-1};vector<ll>dy={0,0,1,-1,1,-1,1,-1};
template<typename T>vector<T> make_v(size_t a,T b){return vector<T>(a,b);}
template<typename... Ts>auto make_v(size_t a,Ts... ts){return vector<decltype(make_v(ts...))>(a,make_v(ts...));}
template<typename T1, typename T2>ostream &operator<<(ostream &os, const pair<T1, T2>&p){return os << "(" << p.first << "," << p.second << ")";}
template<typename T>ostream &operator<<(ostream &os, const vector<T> &v){os<<"[";for(auto &z:v)os << z << ",";os<<"]"; return os;}
template<typename T>void rearrange(vector<int>&ord, vector<T>&v){
  auto tmp = v;
  for(int i=0;i<tmp.size();i++)v[i] = tmp[ord[i]];
}
template<typename Head, typename... Tail>void rearrange(vector<int>&ord,Head&& head, Tail&&... tail){
  rearrange(ord, head);
  rearrange(ord, tail...);
}
template<typename T> vector<int> ascend(const vector<T>&v){
  vector<int>ord(v.size());iota(ord.begin(),ord.end(),0);
  sort(ord.begin(),ord.end(),[&](int i,int j){return make_pair(v[i],i)<make_pair(v[j],j);});
  return ord;
}
template<typename T> vector<int> descend(const vector<T>&v){
  vector<int>ord(v.size());iota(ord.begin(),ord.end(),0);
  sort(ord.begin(),ord.end(),[&](int i,int j){return make_pair(v[i],-i)>make_pair(v[j],-j);});
  return ord;
}
template<typename T> vector<T> inv_perm(const vector<T>&ord){
  vector<T>inv(ord.size());
  for(int i=0;i<ord.size();i++)inv[ord[i]] = i;
  return inv;
}
ll FLOOR(ll n,ll div){assert(div>0);return n>=0?n/div:(n-div+1)/div;}
ll CEIL(ll n,ll div){assert(div>0);return n>=0?(n+div-1)/div:n/div;}
ll digitsum(ll n){ll ret=0;while(n){ret+=n%10;n/=10;}return ret;}
ll modulo(ll n,ll d){return (n%d+d)%d;};
template<typename T>T min(const vector<T>&v){return *min_element(v.begin(),v.end());}
template<typename T>T max(const vector<T>&v){return *max_element(v.begin(),v.end());}
template<typename T>T acc(const vector<T>&v){return accumulate(v.begin(),v.end(),T(0));};
template<typename T>T reverse(const T &v){return T(v.rbegin(),v.rend());};
//mt19937 mt(chrono::steady_clock::now().time_since_epoch().count());
int popcount(ll x){return __builtin_popcountll(x);};
int poplow(ll x){return __builtin_ctzll(x);};
int pophigh(ll x){return 63 - __builtin_clzll(x);};
template<typename T>T poll(queue<T> &q){auto ret=q.front();q.pop();return ret;};
template<typename T>T poll(priority_queue<T> &q){auto ret=q.top();q.pop();return ret;};
template<typename T>T poll(QP<T> &q){auto ret=q.top();q.pop();return ret;};
template<typename T>T poll(stack<T> &s){auto ret=s.top();s.pop();return ret;};
ll MULT(ll x,ll y){if(LLONG_MAX/x<=y)return LLONG_MAX;return x*y;}
ll POW2(ll x, ll k){ll ret=1,mul=x;while(k){if(mul==LLONG_MAX)return LLONG_MAX;if(k&1)ret=MULT(ret,mul);mul=MULT(mul,mul);k>>=1;}return ret;}
ll POW(ll x, ll k){ll ret=1;for(int i=0;i<k;i++){if(LLONG_MAX/x<=ret)return LLONG_MAX;ret*=x;}return ret;}
std::ostream &operator<<(std::ostream &dest, __int128_t value) {
  std::ostream::sentry s(dest);
  if (s) {
    __uint128_t tmp = value < 0 ? -value : value;
    char buffer[128];
    char *d = std::end(buffer);
    do {
      --d;
      *d = "0123456789"[tmp % 10];
      tmp /= 10;
    } while (tmp != 0);
    if (value < 0) {
      --d;
      *d = '-';
    }
    int len = std::end(buffer) - d;
    if (dest.rdbuf()->sputn(d, len) != len) {
      dest.setstate(std::ios_base::badbit);
    }
  }
  return dest;
}
namespace converter{
  int dict[500];
  const string lower="abcdefghijklmnopqrstuvwxyz";
  const string upper="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  const string digit="0123456789";
  const string digit1="123456789";
  void regi_str(const string &t){
    for(int i=0;i<t.size();i++){
      dict[t[i]]=i;
    }
  }
  void regi_int(const string &t){
    for(int i=0;i<t.size();i++){
      dict[i]=t[i];
    }
  }
  vector<int>to_int(const string &s,const string &t){
    regi_str(t);
    vector<int>ret(s.size());
    for(int i=0;i<s.size();i++){
      ret[i]=dict[s[i]];
    }
    return ret;
  }
  vector<int>to_int(const string &s){
    auto t=s;
    sort(t.begin(),t.end());
    t.erase(unique(t.begin(),t.end()),t.end());
    return to_int(s,t);
  }
  
  vector<vector<int>>to_int(const vector<string>&s,const string &t){
    regi_str(t);
    vector<vector<int>>ret(s.size(),vector<int>(s[0].size()));
    for(int i=0;i<s.size();i++){
      for(int j=0;j<s[0].size();j++){
        ret[i][j]=dict[s[i][j]];
      }
    }
    return ret;
  }
  vector<vector<int>>to_int(const vector<string>&s){
    string t;
    for(int i=0;i<s.size();i++){
      t+=s[i];
    }
    sort(t.begin(),t.end());t.erase(unique(t.begin(),t.end()),t.end());
    return to_int(s,t);
  }
  string to_str(const vector<int>&s,const string &t){
    regi_int(t);
    string ret;
    for(auto z:s)ret+=dict[z];
    return ret;
  }
  vector<string> to_str(const vector<vector<int>>&s,const string &t){
    regi_int(t);
    vector<string>ret(s.size());
    for(int i=0;i<s.size();i++){
      for(auto z:s[i])ret[i]+=dict[z];
    }
    return ret;
  }
}
template< typename T = int >
struct edge {
  int to;
  T cost;
  int id;
  edge():to(-1),id(-1){};
  edge(int to, T cost = 1, int id = -1):to(to), cost(cost), id(id){}
  operator int() const { return to; }
};

template<typename T>
using Graph = vector<vector<edge<T>>>;
template<typename T>
Graph<T>revgraph(const Graph<T> &g){
  Graph<T>ret(g.size());
  for(int i=0;i<g.size();i++){
    for(auto e:g[i]){
      int to = e.to;
      e.to = i;
      ret[to].push_back(e);
    }
  }
  return ret;
}
template<typename T>
Graph<T> readGraph(int n,int m,int indexed=1,bool directed=false,bool weighted=false){
  Graph<T> ret(n);
  for(int es = 0; es < m; es++){
    int u,v;
    T w=1;
    cin>>u>>v;u-=indexed,v-=indexed;
    if(weighted)cin>>w;
    ret[u].emplace_back(v,w,es);
    if(!directed)ret[v].emplace_back(u,w,es);
  }
  return ret;
}
template<typename T>
Graph<T> readParent(int n,int indexed=1,bool directed=true){
  Graph<T>ret(n);
  for(int i=1;i<n;i++){
    int p;cin>>p;
    p-=indexed;
    ret[p].emplace_back(i);
    if(!directed)ret[i].emplace_back(p);
  }
  return ret;
}
template<typename T>
struct HLD{
  using D=long long;
  int n;
  vector<int>sz;//部分木サイズ
  vector<D>dep;
  vector<int>par;
  vector<int>head;
  Graph<T> &g;//隣接リスト
  vector<edge<T>>edges;//データ構造に乗せるedge列
  vector<int>in,out;//[in,out)で部分木、[ina,inb]でa~bのパス(aが上)
  vector<int>comp;//連結成分の根
  //inは頂点のindexを表す。また、edge列の下側の頂点である
  HLD(Graph<T> &g,int r=-1):g(g),n(g.size()){
    hld_build(r);
  }
  void hld_build(int root = -1){
    in.assign(n,-1);out.assign(n,-1);dep.assign(n,0);
    par.assign(n,-1);head.assign(n,-1);sz.assign(n,-1);comp.assign(n,-1);
    edges.assign(n,edge<T>());
    if(root == -1){//根がどこでも良い場合(森でも可)
      for(int i=0;i<n;i++){
        if(sz[i] == -1){
          head[i] = i;
          dfs_sz(i, 0, i);
          dfs_hld(i);
        }
      }
    }
    else{
      head[root] = root;
      dfs_sz(root, 0, root);
      dfs_hld(root);
    }
  }
  void dfs_sz(int k, D d,int r){
    sz[k] = 1;
    comp[k] = r;
	dep[k] = d;
    for(auto &e: g[k]){
      if(e.to == par[k])continue;
      par[e.to] = k;
      dfs_sz(e.to, d+e.cost, r);
      sz[k] += sz[e.to];
      if(g[k][0].to==par[k]||sz[e.to] > sz[g[k][0].to])swap(e, g[k][0]);
    }
  }
  int time = 0;
  void dfs_hld(int k){
    in[k] = time++;
    for(auto e:g[k]){
      if(e.to == par[k])continue;
      head[e.to] = (e.to == g[k][0].to ? head[k]: e.to);
      edges[time] = e;
      dfs_hld(e.to);
    }
    out[k] = time;
  }
  int lca(int p,int q){
    while(1){
      if(in[p] < in[q])swap(p,q);
      if(head[p] == head[q])return q;
      p = par[head[p]];
    }
  }
  vector<pair<int,int>>query_path(int p,int q,bool isEdge){
    int r=lca(p,q);
    vector<pair<int,int>>ret;
    for(int i=0;i<2;i++){
      if(i == 1)swap(p,q);
      while(1){
        if(isEdge&&p==r)break;
        if(head[p]==head[r]){
          ret.emplace_back(in[r]+(isEdge?1:i),in[p]+1);
          break;
        }
        ret.emplace_back(in[head[p]],in[p]+1);
        p = par[head[p]];
      }
    }
    return ret;
  }
  vector<vector<pair<int,int>>>query_order_path(int p,int q,bool isEdge){
	//非可換クエリ用、配列0を順番を反転したデータ構造に、配列1を通常のデータ構造に
    vector<vector<pair<int,int>>>ret(2);
    int r=lca(p,q);
    for(int i=0;i<2;i++){
      if(i == 1)swap(p,q);
      while(1){
        if(isEdge&&p==r)break;
        if(head[p]==head[r]){
          if(i==0) ret[i].emplace_back(n-(in[p]+1),n-(in[r]+(isEdge?1:i)));
          else ret[i].emplace_back(in[r]+(isEdge?1:i),in[p]+1);
          break;
        }
        if(i==0) ret[i].emplace_back(n-(in[p]+1),n-(in[head[p]]));
        else ret[i].emplace_back(in[head[p]],in[p]+1);
        p = par[head[p]];
      }
    }
    reverse(ret[1].begin(), ret[1].end());
    return ret;
  }
  pair<int,int>query_subtree(int p,bool isEdge){
    return make_pair(in[p]+isEdge,out[p]);
  }
  //uのv方向の子 子孫関係は前もって確認すること(in,outを見る)
  int child(int u,int v)const{
    while(1){
      if(head[u]==head[v]){
        v=g[u][0].to;
        break;
      }
      v=head[v];
      if(par[v]==u)break;
      v=par[v];
    }
    return v;
  }
  //uをv方向に一つ進めた頂点
  int move(int u,int v)const{
    assert(u!=v);
    if(in[u]<in[v]&&in[v]<out[u])return child(u,v);
    else return par[u];
  }
  D dist(int u,int v){
    return dep[u]+dep[v]-2*dep[lca(u,v)];
  }
  vector<int>rev_in;
  int climb(int u,int k){
    if(rev_in.empty()){
      rev_in.resize(n);
      for(int i=0;i<n;i++)rev_in[in[i]]=i;
    }
    int nd=max<int>(dep[u]-k, 0);
    while(dep[u]>nd){
      if(dep[head[u]]>nd){
        u=par[head[u]];
      }
      else{
        u=rev_in[in[head[u]]+nd-dep[head[u]]];
      }
    }
    return u;
  }
  int jump(int from,int to, int k){
    int r = lca(from, to);
    int d1 = dep[from] - dep[r];
    int d2 = dep[to] - dep[r];
    if(d1 + d2 < k)return -1;
    else if(k <= d1)return climb(from, k);
    else return climb(to, d1 + d2 - k); 
  }
  template<typename I>
  Graph<T>lca_tree(vector<I>&v){
    auto compare=[&](int x,int y){return in[x]<in[y];};
    sort(v.begin(),v.end(),compare);
    int sz1=v.size();
    for(int i=0;i<sz1-1;i++)v.push_back(lca(v[i],v[i+1]));
    sort(v.begin(),v.end(),compare);
    v.erase(unique(v.begin(),v.end()),v.end());
    int sz2=v.size();
    Graph<T>ret(sz2);
    stack<int>st;
    for(int i=0;i<sz2;i++){
      while(!st.empty()&&out[v[st.top()]]<=in[v[i]])st.pop();
      if(!st.empty()){
        ret[st.top()].emplace_back(i,dep[v[i]]-dep[v[st.top()]]);
        ret[i].emplace_back(st.top(),dep[v[i]]-dep[v[st.top()]]);
      }
      st.push(i);
    }
    return ret;
  }
};

const int VERTEX = 0;
const int HEAVY_LIGHT = -1;
const int LIGHT = -2;
const int HEAVY = -3;
template<typename T>
struct StaticToptree{
  const HLD<T> &hld;
  int count;
  int root;
  vector<int>l,r,p;
  vector<int>aff;
  T edge_identity;
  StaticToptree(const HLD<T> &hld):hld(hld),edge_identity(edge_identity),count(hld.n),l(hld.n*2,-1),r(hld.n*2,-1),p(hld.n*2,-1),aff(hld.n*2,VERTEX){
    int hld_root=min_element(hld.in.begin(),hld.in.end())-hld.in.begin();
    root = dfs(hld_root,-1).second;
  }
  //sz,vid
  pair<int,int>dfs(int v,int par){
    int sub=0;
    vector<int>vs;
    vector<int>sz;
    int now=v,pre=par;
    while(1){
      int sum_sz=1;
      //vid,eid
      priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>pq;
      for(int i=1;i<hld.g[now].size();i++){
        if(hld.g[now][i].to==pre)continue;
        auto [sz, vid] = dfs(hld.g[now][i].to, now);
        pq.emplace(sz,vid);
        sum_sz+=sz;
      }
      sub+=sum_sz;
      while(pq.size()>=2){
        auto [sx,x]=pq.top();pq.pop();
        auto [sy,y]=pq.top();pq.pop();
        int nv=count++;
        aff[nv]=LIGHT;
        l[nv]=x;
        p[x]=nv;
        r[nv]=y;
        p[y]=nv;
        pq.emplace(sx+sy,nv);
      }
      int last=now;
      if(!pq.empty()){
        auto [sx,x]=pq.top();pq.pop();
        int nv=count++;
        aff[nv]=HEAVY_LIGHT;
        l[nv]=now;
        p[x]=nv;
        r[nv]=x;
        p[now]=nv;
        last=nv;
      }
      vs.push_back(last);
      sz.push_back(sum_sz);
      if(hld.g[now].empty()||hld.g[now][0]==pre)break;
      pre=now;
      now=hld.g[now][0];
    }
    vector<int>csz(sz.size()+1);
    for(int i=0;i<sz.size();i++){
      csz[i+1]=csz[i]+sz[i];
    }
    auto rec=[&](auto &&rec,int ls,int rs)->int{
      {}
      if(ls+1==rs){
        return vs[ls];
      }
      int sum=csz[rs]-csz[ls];
      int lv=-1,rv=-1;
      if(sz[ls]*2>=sum){
        lv=rec(rec,ls,ls+1);
        rv=rec(rec,ls+1,rs);
      }
      else if(sz[rs-1]*2>=sum){
        lv=rec(rec,ls,rs-1);
        rv=rec(rec,rs-1,rs);
      }
      else{
        int ri=min<int>(rs-1,lower_bound(csz.begin()+ls,csz.begin()+rs,csz[ls]+(sum+1)/2)-csz.begin());
        int li=max(ls+1,ri-1);
        if(abs((csz[li]-csz[ls])*2-sum)<abs((csz[ri]-csz[ls])*2-sum)){
          ri=li;
        }
        lv=rec(rec,ls,ri);
        rv=rec(rec,ri,rs);
      }
      int nv=count++;
      aff[nv]=HEAVY;
      l[nv]=lv,p[lv]=nv;
      r[nv]=rv,p[rv]=nv;
      return nv;
    };
    int last=rec(rec,0,sz.size());
    return make_pair(sub,last);
  }
};

template<typename T,typename V,typename F1,typename F2,typename F3>
struct DynamicReRooting{
  const StaticToptree<T> &t;
  vector<V>seg,ges;
  const F1 &fh;
  const F2 &fl;
  const F3 &fhl;
  const V &M1;
  vector<int>path;
  DynamicReRooting(const StaticToptree<T> &t,const F1 &heavy_merge,const F2 &light_merge,const F3 &heavy_light_merge,const V &M1):
  t(t),fh(heavy_merge),fl(light_merge),fhl(heavy_light_merge),M1(M1){
    seg.assign(t.aff.size(),M1);
    ges.assign(t.aff.size(),M1);
  }
  void set(int k,V val){
    seg[k]=val;
    ges[k]=val;
  }
  void recalc(int k){
    if(t.aff[k]==LIGHT){
      seg[k]=fl(seg[t.l[k]],seg[t.r[k]]);
    }
    else if(t.aff[k]==HEAVY){
      seg[k]=fh(seg[t.l[k]],seg[t.r[k]]);
      //ges[k]=fh(ges[t.r[k]],ges[t.l[k]]);
    }
    else if(t.aff[k]==HEAVY_LIGHT){
      seg[k]=fhl(seg[t.l[k]],seg[t.r[k]]);
      //ges[k]=seg[k];
    }
  }
  void build(){
    for(int i=0;i<t.aff.size();i++){
      recalc(i);
    }
  }
  void update(int k,V val){
    seg[k]=val;
    ges[k]=val;
    while(t.p[k]!=-1){
      k=t.p[k];
      recalc(k);
    }
  }
  int root_path(int k){
    int cnt=0;
    while(1){
      if(cnt>=path.size())path.push_back(0);
      path[cnt++]=k;
      if(t.p[k]==-1)break;
      k=t.p[k];
    }
    return cnt;
  }
  //head,tail,light
  tuple<V,V,V>get(int k){
    int m=root_path(k);
    V head=M1,tail=M1,light=M1;
    int hl=-1;
    for(int i=m-1;i>=1;i--){
      if(t.aff[path[i]]==HEAVY){
        //OUT("HEAVY");
        if(t.l[path[i]]==path[i-1]){
          tail=fh(seg[t.r[path[i]]],tail);
        }
        else{
          auto lt=ges[t.l[path[i]]];
          head=fh(ges[t.l[path[i]]],head);
        }
      }
      else if(t.aff[path[i]]==HEAVY_LIGHT){
        //OUT("HL");
        if(i==1&&k==t.l[path[i]])light=seg[t.r[path[i]]];
        else hl=t.l[path[i]];
      }
      else{
        //OUT("LIGHT");
        //LIGHT
        if(t.l[path[i]]==path[i-1]){
          light=fl(seg[t.r[path[i]]],light);
        }
        else{
          light=fl(seg[t.l[path[i]]],light);
        }
      }
      if(hl!=-1&&t.aff[path[i-1]]!=LIGHT){
        head=fhl(seg[hl],fl(light,fl(head,tail)));
        tail=M1;
        light=M1;
        hl=-1;
      }
      //OUT(path[i],head.ans,head.num,head.mul,tail.ans,tail.num,tail.mul,light.ans);
    }
    return make_tuple(head,tail,light);
  }
  V reroot(int r){
    auto [head,tail,light]=get(r);
    //OUT(seg[r].idx,seg[r].ans,seg[r].mul,fl(light,fl(head,tail)).ans);
    return fhl(seg[r],fl(light,fl(head,tail)));
  }
  V reroot(int r,int k){
    if(r==k)return reroot(r);
    r=t.hld.move(k,r);
    if(r==t.hld.par[k]){
      auto [head,tail,light]=get(k);
      return fhl(seg[k],fl(light,tail));
    }
    else{
      auto [head,tail,light]=get(r);
      return head;
    }
  }
};
template< class T , int maxsize>
struct SquareMatrix {
  using arr = array <T, maxsize>;
  using sqmat = array <arr, maxsize>;
  sqmat A;
  ll n;
  const T iden = 1;//mulの単位元
  const T zero = 0;//addの単位元
  const T add(T x, T y){
    return x + y;
  }
  const T mul(T x, T y){
    return x * y;
  }
  sqmat zeros(){
    sqmat mat;
    for(ll i=0;i<maxsize;i++)for(ll j=0;j<maxsize;j++)mat[i][j]=zero;
    return mat;
  }
  SquareMatrix() {
    n = maxsize;
    A = zeros();
  }
  SquareMatrix(size_t N) : n(N){
    A = zeros();
  };
  SquareMatrix(vector<vector<T>>v):n(v.size()){
    for(ll i=0;i<n;i++)for(ll j=0;j<n;j++)A[i][j]=v[i][j];
  };
  inline const arr &operator[](int k) const {
    return (A[k]);
  }

  inline arr &operator[](int k) {
    return (A[k]);
  }
  static SquareMatrix I(size_t N){
    SquareMatrix mat(N);
    for(int i = 0; i < N; i++) mat[i][i] = mat.iden;
    return (mat);
  }
  SquareMatrix &operator+=(const SquareMatrix &B) {
    for(int i = 0; i < n; i++)
      for(int j = 0; j < n; j++)
        (*this)[i][j] = add((*this)[i][j], B[i][j]);
    return (*this);
  }

  SquareMatrix &operator*=(const SquareMatrix &B) {
    sqmat C = zeros();
    for(int i = 0; i < n; i++)
      for(int j = 0; j < n; j++)
        for(int k = 0; k < n; k++)
          C[i][j] = add(C[i][j],mul((*this)[i][k] , B[k][j]));
    A.swap(C);
    return (*this);
  }

  SquareMatrix tenti() {
    SquareMatrix C(n);
    for(int i = 0; i < n; i++)
      for(int j = 0; j < n; j++)
        C[i][j] = (*this)[j][i];
    return C;
  }

  SquareMatrix &operator^=(long long k) {
    SquareMatrix B = SquareMatrix::I(n);
    while(k > 0) {
      if(k & 1) B *= *this;
      *this *= *this;
      k >>= 1LL;
    }
    A.swap(B.A);
    return (*this);
  }

  SquareMatrix operator+(const SquareMatrix &B) const {
    return (SquareMatrix(*this) += B);
  }

  SquareMatrix operator*(const SquareMatrix &B) const {
    return (SquareMatrix(*this) *= B);
  }

  SquareMatrix operator^(const long long k) const {
    return (SquareMatrix(*this) ^= k);
  }
  bool operator==(const SquareMatrix &B)const{
    return this->A == B.A;
  }
  bool operator!=(const SquareMatrix &B)const{
    return this->A != B.A;
  }
  SquareMatrix& operator=(const SquareMatrix &b){
    this->n=b.n;
    this->A=b.A;
    return *this;
  }
  friend ostream &operator<<(ostream &os, SquareMatrix p) {
    for(int i = 0; i < p.n; i++) {
      os << "[";
      for(int j = 0; j < p.n; j++) {
        os << p[i][j] << (j + 1 == p.n ? "]\n" : ",");
      }
    }
    return (os);
  }
};
template< int mod >
struct ModInt {
  int x;

  ModInt() : x(0) {}

  ModInt(int64_t y) : x(y >= 0 ? y % mod : (mod - (-y) % mod) % mod) {}

  ModInt &operator+=(const ModInt &p) {
    if((x += p.x) >= mod) x -= mod;
    return *this;
  }

  ModInt &operator-=(const ModInt &p) {
    if((x += mod - p.x) >= mod) x -= mod;
    return *this;
  }

  ModInt &operator*=(const ModInt &p) {
    x = (int) (1LL * x * p.x % mod);
    return *this;
  }

  ModInt &operator/=(const ModInt &p) {
    *this *= p.inverse();
    return *this;
  }

  ModInt operator-() const { return ModInt(-x); }

  friend ModInt operator+(const ModInt& lhs, const ModInt& rhs) {
        return ModInt(lhs) += rhs;
  }
  friend ModInt operator-(const ModInt& lhs, const ModInt& rhs) {
        return ModInt(lhs) -= rhs;
  }
  friend ModInt operator*(const ModInt& lhs, const ModInt& rhs) {
        return ModInt(lhs) *= rhs;
  }
  friend ModInt operator/(const ModInt& lhs, const ModInt& rhs) {
        return ModInt(lhs) /= rhs;
  }

  bool operator==(const ModInt &p) const { return x == p.x; }

  bool operator!=(const ModInt &p) const { return x != p.x; }

  ModInt inverse() const {
    int a = x, b = mod, u = 1, v = 0, t;
    while(b > 0) {
      t = a / b;
      swap(a -= t * b, b);
      swap(u -= t * v, v);
    }
    return ModInt(u);
  }

  ModInt pow(int64_t n) const {
    ModInt ret(1), mul(x);
    while(n > 0) {
      if(n & 1) ret *= mul;
      mul *= mul;
      n >>= 1;
    }
    return ret;
  }
  pair<int,int>frac(){
    for(int j=1;j<=300;j++){
      for(int i=-300;i<=300;i++){
        if(ModInt(i)/j==*this){
          return make_pair(i,j);
        }
      }
    }
    return make_pair(-1,-1);
  }
  friend ostream &operator<<(ostream &os, const ModInt &p) {
    return os << p.x;
  }

  friend istream &operator>>(istream &is, ModInt &a) {
    int64_t t;
    is >> t;
    a = ModInt< mod >(t);
    return (is);
  }

  static int get_mod() { return mod; }
};

template< typename T >
struct Combination {
  vector< T > _fact, _rfact, _inv;

  Combination(ll sz) : _fact(sz + 1), _rfact(sz + 1), _inv(sz + 1) {
    _fact[0] = _rfact[sz] = _inv[0] = 1;
    for(ll i = 1; i <= sz; i++) _fact[i] = _fact[i - 1] * i;
    _rfact[sz] /= _fact[sz];
    for(ll i = sz - 1; i >= 0; i--) _rfact[i] = _rfact[i + 1] * (i + 1);
    for(ll i = 1; i <= sz; i++) _inv[i] = _rfact[i] * _fact[i - 1];
  }

  inline T fact(ll k) const { return _fact[k]; }

  inline T rfact(ll k) const { return _rfact[k]; }

  inline T inv(ll k) const { return _inv[k]; }

  T P(ll n, ll r) const {
    if(r < 0 || n < r) return 0;
    return fact(n) * rfact(n - r);
  }

  T C(ll p, ll q) const {
    if(q < 0 || p < q) return 0;
    return fact(p) * rfact(q) * rfact(p - q);
  }
  
  T RC(ll p, ll q) const {
    if(q < 0 || p < q) return 0;
    return rfact(p) * fact(q) * fact(p - q);
  }

  T H(ll n, ll r) const {
    if(n < 0 || r < 0) return (0);
    return r == 0 ? 1 : C(n + r - 1, r);
  }
  //+1がm個、-1がn個で prefix sumが常にk以上
  T catalan(ll m,ll n,ll k){
    if(n>m-k)return 0;
    else return C(n+m,m)-C(n+m,n+k-1);
  }
};
using modint = ModInt< MOD9 >;modint mpow(ll n, ll x){return modint(n).pow(x);}modint mpow(modint n, ll x){return n.pow(x);}
//using modint=ld;modint mpow(ll n, ll x){return pow(n,x);}modint mpow(modint n, ll x){return pow(n,x);}
using Comb=Combination<modint>;


void solve(){
	ll res=0,buf=0;
  bool judge = true;

  using SQ=SquareMatrix<modint,3>;
  int n,q;cin>>n>>q;
  vector<int>lch(n);
  Graph<int>g(n);
  struct A{
    SQ lx;
    //rx;
    int v; //一番上の頂点
    array<modint,3>val;
  };
  A ident;
  ident.lx=SQ(3);
  //ident.rx=SQ(3);
  ident.v=-1;
  ident.val[0]=1,ident.val[1]=1,ident.val[2]=1;
  vector<bool>lp(n);
   auto tenti=[&](SQ a){
    array<array<modint,3>,3>mat;
    rep(i,0,3)rep(j,0,3)mat[j][i]=a[i][j];
    return mat;
  };
  auto get=[&](int v,int x,int y,int z){
    auto ret=ident;
    ret.v=v;
    ret.lx[1][0]=z;
    ret.lx[0][1]=-z;
    ret.lx[2][0]=-y;
    ret.lx[0][2]=y;
    ret.lx[1][2]=-x;
    ret.lx[2][1]=x;

    // ret.rx[1][0]=-z;
    // ret.rx[0][1]=z;
    // ret.rx[2][0]=y;
    // ret.rx[0][2]=-y;
    // ret.rx[1][2]=x;
    // ret.rx[2][1]=-x;
    if(!lp[v])ret.lx.A=tenti(ret.lx);
    
    ret.val[0]=x,ret.val[1]=y,ret.val[2]=z;
    //OUT(ret.x);
    return ret;
  };
 
  auto fh=[&](A h,A l){
    if(h.v==-1)return l;
    if(l.v==-1)return h;
    //OUT(h.val,l.val);
    //OUT(h.lx);
    h.val[0]=0,h.val[1]=0,h.val[2]=0;
    rep(i,0,3)rep(j,0,3)h.val[j]+=l.val[i]*h.lx[i][j];
    h.lx=l.lx*h.lx;
    //if(!lch[l.v])h.lx.A=tenti(h.lx);
    //OUT(h.v);
    return h;
  };
  auto fl=[&](A l,A r){
    if(l.v==-1)return r;
    if(r.v==-1)return l;
    //OUT(l.v,r.v);
    assert(false);
    //二分木なので単位元以外ないはず
  };
  
  auto fhl=[&](A h,A l){
    if(h.v==-1)return l;
    if(l.v==-1)return h;
    //OUT(l.v,h.v);
    auto ret=get(h.v,l.val[0].x,l.val[1].x,l.val[2].x);
    return ret;
  };
  
  vector<int>ix(n,0),iy(n,0),iz(n,0);
  rep(i,0,n){
    char c;cin>>c;
    if(c=='x'){
      int l,r;cin>>l>>r;l--;r--;
      lch[l]=true;
      g[i].EB(l);
      g[i].EB(r);
    }
    else{
      cin>>ix[i]>>iy[i]>>iz[i];
    }
  }
  //OUT(lch);
  auto gg=g;
  HLD hld(g,0);
  rep(i,0,n){
    if(g[i].size()>=1&&lch[g[i][0]]){
      lp[i]=true;
    }
  }
  OUT(g,gg,lp);
  StaticToptree st(hld);
  DynamicReRooting seg(st,fh,fl,fhl,ident);
  rep(i,0,n){
    seg.set(i,get(i,ix[i],iy[i],iz[i]));
  }
  seg.build();
  // rep(i,0,seg.seg.size()){
  //   OUT(i,seg.seg[i].v);
  // }
  auto dp=[&](){
    auto cross=[&](array<modint,3>l,array<modint,3>r){
      array<modint,3>ret;
      ret[0]=l[1]*r[2]-l[2]*r[1];
      ret[1]=l[2]*r[0]-l[0]*r[2];
      ret[2]=l[0]*r[1]-l[1]*r[0];
      return ret;
    };
    auto dfs=[&](auto &&f,int v)->array<modint,3> {
      if(g[v].size()==0){
        return {ix[v],iy[v],iz[v]};
      }
      else{
        return cross(f(f,gg[v][0]),f(f,gg[v][1]));
      }
    };
    return dfs(dfs,0);
  };
  while(q--){
    int v,x,y,z;cin>>v>>x>>y>>z;v--;
    
    seg.update(v,get(v,x,y,z));
    ix[v]=x,iy[v]=y,iz[v]=z;
    //OUT(seg.seg[0].x,seg.seg[0].v);
    //auto ret=seg.reroot(0);
    auto ret=seg.seg[2*n-2];
    // rep(i,0,seg.seg.size()){
    //   if(q==2){
    //     OUT(i,st.l[i],st.r[i],seg.seg[i].lx,seg.seg[i].v,seg.seg[i].val);
    //     OUT("-----");
    //   }
    // }
    //OUT(ret.v,ret.val);
    //OUT(dp(),ret.val);
    debug(ret.val);
    //debug(dp());
    // OUT(mat1.x,mat2.x,mat3.x);
    // OUT(mat2.x*mat3.x);
    // OUT(mat1.x*(mat2.x*mat3.x));
  }
}

int main(){
  cin.tie(nullptr);
  ios_base::sync_with_stdio(false);
  ll res=0,buf=0;
  bool judge = true;
  int T = 1;
  //cin>>T;
  while(T--){
    solve();
  }
  return 0;
}

这程序好像有点Bug,我给组数据试试?

詳細信息

Test #1:

score: 100
Accepted
time: 0ms
memory: 3664kb

input:

5 3
x 2 3
v 1 0 1
x 4 5
v 0 2 1
v 1 1 1
4 1 2 3
5 0 1 1
4 0 2 2

output:

998244351 0 2 
1 998244351 998244352 
0 0 0 

result:

ok 9 numbers

Test #2:

score: 0
Accepted
time: 402ms
memory: 93096kb

input:

199999 100000
x 137025 65661
v 572518668 158967010 74946561
x 129836 192657
x 141948 187810
v 574918069 328924434 141474729
x 143312 111002
x 52772 148497
v 922857701 690080961 651915759
v 656198340 28002884 129579416
v 639893144 265359784 646791226
v 796871409 411409966 598676495
v 882562617 224394...

output:

393120558 773766615 387297348 
759959566 981774500 128012497 
294611811 980011608 533642029 
404379574 745296852 53493560 
404565501 828869760 78021156 
592494858 647751304 881427733 
190018467 515243135 518180555 
628180500 509984554 257430135 
13737245 352087791 917410487 
932051309 366591227 4799...

result:

ok 300000 numbers

Test #3:

score: 0
Accepted
time: 432ms
memory: 93056kb

input:

199999 100000
x 154525 80092
v 450407262 725458410 590777520
x 24720 135901
v 719242117 114943104 186796011
v 382530926 89156744 943939337
x 183376 26042
x 109984 157873
x 151637 150600
x 4115 27454
x 163135 92648
x 16764 33212
v 849210403 945083972 689295397
v 471196117 68587428 225597765
x 24643 5...

output:

677067461 996514296 449166851 
810403092 258196842 853459733 
410756156 253348518 912664471 
327134890 519245783 922528759 
317367558 536888537 506214109 
484753530 879045782 772404948 
422920052 152084658 517340457 
1207902 348787162 320821077 
776293878 699474926 711114530 
871858473 468497588 822...

result:

ok 300000 numbers

Test #4:

score: 0
Accepted
time: 421ms
memory: 92952kb

input:

199999 100000
x 72889 193806
x 35339 33069
v 314802407 406980523 492377265
x 108307 60027
x 144922 140917
v 328481079 117663280 644171354
v 482028404 951751561 166221217
v 936461869 436114879 421819757
x 152919 99965
x 61168 150607
v 56403640 743462679 134896557
v 24809217 462947115 966139991
v 7828...

output:

23709876 380448367 629159667 
760678420 539369190 611778104 
114926687 653692915 939877414 
674199470 304745735 544123803 
953800112 186017361 49200537 
327282782 871001677 293980713 
588783157 502130649 190564297 
102680906 993889016 963478755 
510012481 105416897 281770975 
811082806 367139818 493...

result:

ok 300000 numbers

Test #5:

score: 0
Accepted
time: 412ms
memory: 93164kb

input:

199999 100000
x 134204 79203
v 152855933 152545887 271660214
v 393332175 182708769 115884220
v 731792305 965028257 676889584
x 89631 14495
x 142016 85686
v 600051847 172947969 906920949
v 846126215 214556203 657929902
x 125721 133526
x 93179 35713
v 330716449 450417250 611411649
v 114397688 58644961...

output:

139597616 375474977 14619793 
889328460 79727434 363703631 
397351102 877961602 429046190 
588368345 819425899 502148739 
520578911 186408072 484373545 
997888597 816534316 338411279 
334166269 288211584 608252640 
509280845 362972392 286415695 
363396960 878881251 3658455 
711270872 94816531 100279...

result:

ok 300000 numbers

Test #6:

score: 0
Accepted
time: 402ms
memory: 93480kb

input:

199999 100000
x 29842 60343
x 22382 27649
v 148997533 411153785 529195552
v 831453378 856711025 439562917
x 183061 152107
v 208562249 845550020 248974502
x 8708 152913
v 901332053 480035531 424365358
v 120556946 620074725 884675784
v 493886564 455460926 851190410
x 63346 64739
x 35246 36255
v 762936...

output:

236797322 190218414 70559261 
661765898 266356472 481630021 
410967670 613729303 804008156 
92638320 37926778 82924205 
357869883 232766711 579608532 
691702082 124868602 187367212 
237610689 608489848 581104410 
848616732 907873139 859807891 
614624615 454674844 673629667 
485784731 743926138 16859...

result:

ok 300000 numbers

Test #7:

score: 0
Accepted
time: 417ms
memory: 93524kb

input:

199999 100000
x 179471 175117
x 189060 178495
x 20142 58065
x 22916 150184
v 704047412 186112247 660817663
v 761554808 199099716 794321264
v 362925435 508140595 251556541
v 65674025 717152823 157775106
v 325965317 977108704 50644678
v 566946741 833186394 771714200
v 996708965 76780827 625429369
v 85...

output:

365258325 105829774 612397830 
731509055 576900445 663777200 
553518677 415454275 7683807 
468131249 577225931 513594285 
215590236 861146274 812820392 
669985796 229486834 564691763 
929231866 520228049 774609748 
29950289 569366391 721072115 
644573107 513714638 554458153 
728007201 423847330 1008...

result:

ok 300000 numbers

Test #8:

score: 0
Accepted
time: 419ms
memory: 94024kb

input:

199999 100000
x 73506 171332
x 135330 187765
v 308206068 679940956 278078069
v 442448744 196158033 738117032
x 194709 115786
v 208526122 936976225 340056181
x 42663 43401
x 55484 199464
v 865443128 131903961 74265613
x 44659 44773
x 32199 18455
v 986118756 284329619 244212114
v 793747964 649179736 4...

output:

429717039 868308596 175018519 
966246118 532451840 773132006 
457086098 631788280 989689243 
550574851 6706768 416615899 
285141084 505326489 916518702 
457465389 653530244 951605771 
614211832 767828057 44273794 
698196640 494937773 99337798 
718503234 422078037 151379051 
20520347 707143833 781787...

result:

ok 300000 numbers

Test #9:

score: 0
Accepted
time: 396ms
memory: 94268kb

input:

199999 100000
x 109220 170287
v 563361501 367416904 98790213
x 31431 96958
x 99594 159052
x 95382 129615
v 61965807 547448247 405891792
v 443530416 578856323 588763197
v 761021716 795533831 212530056
v 370964907 391812631 255457982
x 49713 153066
x 141543 111694
v 144135957 614962153 284136518
x 416...

output:

433293962 336914247 747368803 
992117520 9180464 159616244 
483825959 496735833 964507719 
912495370 737285784 595438897 
467123496 44306423 562070292 
903488238 42971643 61415659 
269853145 336741491 565138878 
926999098 134871683 277614816 
644727031 476324825 69621281 
984868613 112590560 6886261...

result:

ok 300000 numbers

Test #10:

score: 0
Accepted
time: 0ms
memory: 3660kb

input:

3 1
x 2 3
v 998244352 998244352 998244352
v 0 0 0
3 1 2 0

output:

2 998244352 998244352 

result:

ok 3 number(s): "2 998244352 998244352"

Test #11:

score: 0
Accepted
time: 387ms
memory: 95040kb

input:

199999 100000
x 199465 1690
x 70268 106693
v 194793703 729830314 457557419
x 64673 6910
v 755452906 141328541 558160677
v 725017524 158685295 201414156
x 161801 27226
x 181414 47025
v 387724146 819109666 514628998
v 252532326 97757436 828777580
v 200868967 692540096 706977766
v 300419109 2053530 824...

output:

627210517 640945891 400484640 
305641486 893058825 99893167 
735729088 805595533 283037791 
377070714 357962902 336785549 
835938680 634694731 22388934 
493696932 612552793 516945234 
963890355 517530875 48223226 
215318080 742583745 379791022 
135074745 970450812 921824280 
86572382 481696244 72892...

result:

ok 300000 numbers

Test #12:

score: 0
Accepted
time: 368ms
memory: 97652kb

input:

199999 100000
x 37758 141919
v 148792593 369372129 595139892
x 59335 149367
v 452667329 904801829 628919068
v 160106559 532238331 179544300
v 850489754 705167899 265598880
x 120963 167491
x 92157 46815
v 444945978 987276260 843838004
x 189040 28027
v 889755401 760730228 3237333
x 168907 82672
v 2329...

output:

897185498 177437016 653646802 
48860209 883514812 764698776 
505088312 585962448 546090395 
914246027 540944167 682989725 
965835151 803706423 302298107 
452996535 714783487 961852197 
882717809 425959754 886391042 
203667304 454663502 78105722 
512196135 727218227 418204527 
274934801 270977361 824...

result:

ok 300000 numbers

Extra Test:

score: 0
Extra Test Passed