傻子做法:
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int treee[N];
int sum=0,flag=0;
int find_public_father(int u,int v){
int t1=1,t2=1,arr1[10000],arr2[10000];
arr1[0]=u; arr2[0]=v;
while(u>1){
u/=2;
arr1[t1++]=u;
}
while(v>1){
v/=2;
arr2[t2++]=v;
}
for(int i=0;i<t1;i++){
for(int j=0;j<t2;j++){
if(arr1[i]==arr2[j]){
return arr1[i];
}
}
}
}
void add(int u,int v,int w){
if(u==v){
flag=1;
return;
}else if(u>v){
return;
}
add(2*u,v,w);
if(flag){
treee[2*u]+=w;
return;
}
add(2*u+1,v,w);
if(flag){
treee[2*u+1]+=w;
return;
}
}
void travel(int u,int v){
if(u==v){
flag=1;
return;
}else if(u>v){
return;
}
travel(2*u,v);
if(flag){
sum+=treee[2*u];
return;
}
travel(2*u+1,v);
if(flag){
sum+=treee[2*u+1];
return;
}
}
int main(){
int q; cin >> q;
while(q--){
int x,u,v,w;; cin >> x;
if(x==1){
cin >> u >> v >> w;
int father=find_public_father(u,v);
// cout << "their father is:" << father << endl;
flag=0; add(father,u,w);
flag=0; add(father,v,w);
}else if(x==2){
cin >> u >> v;
int father=find_public_father(u,v);
sum=0;
flag=0; travel(father,u);
flag=0; travel(father,v);
cout << sum << endl;
}
// for(int i=0;i<8;i++){
// cout << treee[i] << " ";
// }
}
// system("pause");
return 0;
}
正解:https://www.cnblogs.com/wzl19981116/p/10087302.html
void Add(ll x,ll y,ll w)
{
while(1)
{
if(x>y)
{
a[x]+=w;
x/=2;
}else if(x<y)
{
a[y]+=w;
y/=2;
}else
break;
}
}
ll query(ll x,ll y)
{
ll ans=0;
while(1)
{
if(x>y)
{
ans+=a[x];
x/=2;
}else if(x<y)
{
ans+=a[y];
y/=2;
}else
{
return ans;
}
}
}