#include<bits/stdc++.h>
#define fi first
#define se second
#define N 10005
using namespace std;
int n,m,qwq,fa[N],num[N],size[N];
int get(int x){
if(x==fa[x]) return x;
return fa[x]=get(fa[x]);
}
int ans=0,a[5005][5005];
vector<pair<int,int> > v[N<<2];
stack<pair<int,int> > s[N<<2];
void merge(int p,pair<int,int> a){
int x=get(a.fi);
int y=get(a.se);
if(x==y) return ;
if(size[x]>size[y]) swap(x,y);
s[p].push(make_pair(x,y));
ans--;
fa[x]=y;
size[y]+=size[x];
}
void del(int p){
while(!s[p].empty()){
pair<int,int> x=s[p].top();
s[p].pop();
fa[x.fi]=x.fi;
size[x.se]-=size[x.fi];
ans++;
}
}
void modify(int p,int l,int r,int ql,int qr,pair<int,int> x){
if(ql<=l&&qr>=r){
v[p].push_back(x);
return ;
}
int mid=(l+r)>>1;
if(ql<=mid) modify(p<<1,l,mid,ql,qr,x);
if(qr>mid) modify(p<<1|1,mid+1,r,ql,qr,x);
}
void query(int p,int l,int r) {
int sz=v[p].size();
for(int i=0;i<sz;i++) merge(p,v[p][i]);
if(l==r) num[l]=ans;
else{
int mid=(l+r)>>1;
query(p<<1,l,mid);
query(p<<1|1,mid+1,r);
}
del(p);
}
int q[N],cnt;
int main(){
cin>>n>>m;
ans=n;
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
a[u][v]=a[v][u]=1;
}
cin>>qwq;
for(int i=1;i<=qwq;i++) {
char c;
cin>>c;
if(c=='Q') q[++cnt]=i;
if(c=='A'){
int u,v;
cin>>u>>v;
a[u][v]=a[v][u]=i;
}
if(c=='D'){
int u,v;
cin>>u>>v;
modify(1,1,qwq,a[u][v],i-1,make_pair(u,v));
a[u][v]=a[v][u]=0;
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<i;j++)
if(a[i][j]) modify(1,1,qwq,a[i][j],qwq,make_pair(i,j));
query(1,1,qwq);
for(int i=1;i<=cnt;i++) cout<<num[q[i]]<<endl;
return 0;
}
前三个点MLE,这是怎么做到的?