QOJ.ac

QOJ

ID提交记录ID题目HackerOwner结果提交时间测评时间
#1495#874053#8616. Fast Tree QueriessuperguymjCrysfly🌈Failed.2025-01-31 02:34:522025-01-31 02:34:52

详细

Extra Test:

Accepted
time: 2196ms
memory: 19652kb

input:

100000 100000
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
10 11
11 12
12 13
13 14
14 15
15 16
16 17
17 18
18 19
19 20
20 21
21 22
22 23
23 24
24 25
25 26
26 27
27 28
28 29
29 30
30 31
31 32
32 33
33 34
34 35
35 36
36 37
37 38
38 39
39 40
40 41
41 42
42 43
43 44
44 45
45 46
46 47
47 48
48 49
49 50
50 51
51 ...

output:


result:

ok 0 number(s): ""

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#874053#8616. Fast Tree QueriesCrysfly🌈AC ✓2931ms19276kbC++112.3kb2025-01-27 12:42:482025-01-27 12:42:50

answer

#pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
#define poly vector<int>
#define IOS ios::sync_with_stdio(false)
#define ll long long
#define mp make_pair
#define mt make_tuple
#define pa pair < int,int >
#define fi first
#define se second
#define inf 1e18
#define mod 998244353
#define sz(x) (int)((x).size())
// #define int ll
//#define N
using namespace std;
const int N=100005;
int siz[N],son[N];
poly G[N];
int dep[N],dfn[N],DFN,Tp[N];
int a[N];
int n,q,ffa[N];
void dfs(int k,int fa)
{
  ffa[k]=fa;
  dep[k]=dep[fa]+1;
  siz[k]=1;
  for (auto u:G[k])
  {
    if (u==fa) continue;
    dfs(u,k);
    siz[k]+=siz[u];
    if (siz[u]>siz[son[k]]) son[k]=u;
  }
}
void dfs1(int k,int tp)
{
  dfn[k]=++DFN;
  Tp[k]=tp;
  if (son[k]) dfs1(son[k],tp);
  for (auto u:G[k])
  {
    if (u==son[k]||dep[u]<dep[k]) continue;
    dfs1(u,u);
  }
}
inline void add(int l,int r,int v)
{
  for (int i=l;i<=r;i++)
    a[i]+=v;
}
inline int query(int l,int r)
{
  int res=0;
  for (int i=l;i<=r;i++) res^=a[i];
  return res;
}
mt19937_64 rnd(time(0));
inline int rndd(int l,int r)
{
  return rnd()%(r-l+1)+l;
}
void BellaKira()
{
  n=100000,q=100000;
  cin>>n>>q;
  for (int i=1;i<n;i++)
  {
    int x,y;
    x=i;
    y=i+1;
    cin>>x>>y;
    G[x].push_back(y);
    G[y].push_back(x);
  }
  dfs(1,0);
  dfs1(1,1);
  for (int i=1;i<=n;i++) a[dfn[i]]=i;
  while (q--)
  {
    char c;
    if (rnd()%2) c='+';else c='?';
    cin>>c;
    
    if (c=='+')
    {
      int x,y,w;
      x=rnd()%n+1,y=rnd()%n+1,w=rnd()%10000+1;
            x=1,y=n;
      cin>>x>>y>>w;
      while (Tp[x]!=Tp[y])
      {
        if (dep[Tp[x]]<dep[Tp[y]]) swap(x,y);
        add(dfn[Tp[x]],dfn[x],w);
        x=ffa[Tp[x]];
      }
      if (dep[x]>dep[y]) swap(x,y);
      add(dfn[x],dfn[y],w);
    } else
    {
      int ans=0;
      int x,y;
      x=rnd()%n+1,y=rnd()%n+1;
            x=1,y=n;
      cin>>x>>y;
      while (Tp[x]!=Tp[y])
      {
        if (dep[Tp[x]]<dep[Tp[y]]) swap(x,y);
        ans^=query(dfn[Tp[x]],dfn[x]);
        x=ffa[Tp[x]];
      }
      if (dep[x]>dep[y]) swap(x,y);
      ans^=query(dfn[x],dfn[y]);
      cout<<ans<<'\n';
    }
  }
      
}
signed main()
{
  IOS;
  cin.tie(0);
  int T=1;
  while (T--)
  {
    BellaKira();
  }
}