function main(input) {
  input=input.trim();
  const N = parseInt(input.split("\n")[0].split(" ")[0], 10);
  const Q = parseInt(input.split("\n")[0].split(" ")[1], 10);
  var arr1=[]
  var arr2=[]
  for(var i=0; i<N-1; i++){
    var temp=[]
    temp.push(parseInt(input.split("\n")[i+1].split(" ")[0], 10))
    temp.push(parseInt(input.split("\n")[i+1].split(" ")[1], 10))
    arr1.push(temp)
  }
  for(var i=0; i<Q; i++){
    var temp=[]
    temp.push(parseInt(input.split("\n")[i+N].split(" ")[0], 10))
    temp.push(parseInt(input.split("\n")[i+N].split(" ")[1], 10))
    arr2.push(temp)
  }
  //console.log(arr1);
  //console.log(arr2);

  var ans=[]
  var ichi=0;
  for(var i=0; i<Q; i++){
    if(arr2[i][0]==1){
      ichi+=arr2[i][1]
    }
  }
  //console.log(ichi);
  ans.push(ichi)

  //ここからは2番目以降について
  //「bの中からその数字を探して、そのbに対応するaのカウンター値をans配列から取得」
  //→「pの中からbと同じ数値のものを探して、その全てについて対応するqの値を先程取得したaのカウンター値に足す」
  //→「その値を、最終的にbのカウンター値としてans配列にpushする」
  //という操作を行う

  for(var i=1; i<N; i++){
    var counterA
    var taiouA

    //bに対応するaを取得
    for(var j=0; j<N-1; j++){
      if(arr1[j][1]==i+1){
        taiouA=arr1[j][0]
        break //←どの階層まで？
      }
    }

    //aのカウンター値を取得
    counterA=ans[taiouA-1]

    //arr2の一列目の中から、bと同じ数値のものを探してカウンター値とする
    var tempCounter=0
    for(var j=0; j<Q; j++){
      if(arr2[j][0]==i+1){
        tempCounter+=arr2[j][1]
      }
    }

    ans.push(counterA+tempCounter)
  }
  console.log(ans);
}
main(require('fs').readFileSync('/dev/stdin', 'utf8'));