set暴力维护一下标记。。
#include<bits/stdc++.h>
using namespace std;
set<int> s[200005];
int n,m;
int send[200005],recieve[200005];
inline int read()
{
int a=0,f=1; char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();}
while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();}
return a*f;
}
int main()
{
n=read(); m=read();
for (int i=1;i<=m;i++)
{
char opt[5];
scanf("%s",opt);
int x,y;
switch (opt[0])
{
case '!':
x=read();
send[x]++;
break;
case '+':
x=read(),y=read();
s[x].insert(y); s[y].insert(x);
recieve[y]-=send[x]; recieve[x]-=send[y];
break;
case '-':
x=read(),y=read();
s[x].erase(y); s[y].erase(x);
recieve[y]+=send[x]; recieve[x]+=send[y];
break;
}
}
for (int i=1;i<=n;i++)
for (set<int>::iterator it=s[i].begin();it!=s[i].end();it++)
recieve[*it]+=send[i];
for (int i=1;i<=n;i++)
{
printf("%d",recieve[i]);
if (i!=n) putchar(32);
}
return 0;
}