map瞎怼
map保存子树权值和
dfs的时候直接贪心就好了
add o(30lg)
decay o(30lg)
#include<cstdio>
#include<iostream>
#include<cstring>
#include<map>
using namespace std;
map<int,int> mp;
int mi[33];
int h,q;
double ans=0;
void dfs(int u,int dep,int pre){
if(dep==h||mp[u]==0){
ans+=(double)max(pre,mp[u])/mi[dep];
return ;
}
int ll=mp[u*2],rr=mp[u*2+1],o=mp[u];
if(ll>rr){
ans+=(double)max(pre,o-rr)/mi[dep+1];
dfs(u*2,dep+1,max(pre,o-ll));
}
else {
ans+=(double)max(pre,o-ll)/mi[dep+1];
dfs(u*2+1,dep+1,max(pre,o-rr));
}
}
int main(){
#ifdef DouBi
freopen("in.cpp","r",stdin);
#endif // DouBi
mi[0]=1;
for(int i=1;i<=30;i++){
mi[i]=mi[i-1]*2;
}
while(scanf("%d%d",&h,&q)!=EOF){
mp.clear();
while(q--){
char ss[10];scanf("%s",ss);
if(ss[0]=='a'){
int v,e;scanf("%d%d",&v,&e);
while(v){
mp[v]+=e;
v/=2;
}
}
else {
ans=0;
dfs(1,0,0);
printf("%.10lf\n",ans);
}
}
}
return 0;
}