QOJ.ac
QOJ
ID | 提交记录ID | 题目 | Hacker | Owner | 结果 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|
#1495 | #874053 | #8616. Fast Tree Queries | superguymj | Crysfly🌈 | Failed. | 2025-01-31 02:34:52 | 2025-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 Queries | Crysfly🌈 | AC ✓ | 2931ms | 19276kb | C++11 | 2.3kb | 2025-01-27 12:42:48 | 2025-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();
}
}