暴力的方法能过,但是网上有更优化的方法,
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
using namespace std;
#define LL long long
#define N 100010
#define mod 1000000007
vector<int> V[N],up[N];//V记录边,up记录邻接节点,但度数自己大
int in[N];//记录节点度数
int sum[N],add[N];//add 保存更新
int main()
{
// priority_queue<int,vector<int>,greater<int> >
int T;
int n,m,Q;
int a,b;
int i,j;
scanf("%d",&T);
while(T--)
{
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++){
V[i].clear();
in[i]=0;
up[i].clear();
sum[i]=add[i]=0;
}
while(m--)
{
scanf("%d %d",&a,&b);
V[a].push_back(b);
V[b].push_back(a);
in[b]++;
in[a]++;
}
for(a=1;a<=n;a++)
for(j=0;j<V[a].size();j++)
{
b=V[a][j];
if(in[b]>=in[a])
up[a].push_back(b);
}
scanf("%d",&Q);
int cmd,u,v;
while(Q--)
{
scanf("%d %d",&cmd,&u);
if(cmd==0)
{
scanf("%d",&v);
add[u]+=v;
for(i=0; i<up[u].size(); i++)
{
j=up[u][i];
sum[j]+=v;
}
}
else
{
int ans=sum[u];
for(i=0; i<up[u].size(); i++)
{
j=up[u][i];
if(in[j]!=in[u])
ans+=add[j];
}
printf("%d\n",ans);
}
}
}
return 0;
}