#include <bits/stdc++.h>
#define ll int
#define ld long double
#define el "\n"
#define _ROOT_ int main()
#pragma GCC optimize("O2")
#define FOR(i,l,r) for(int i = l ; i <= r ; i ++)
#define FORD(i,r,l) for(int i = r ; i >= l ; i --)
#define REP(i, a ) for(int i = 0 ; i < a ; i ++ )
#define fi first
#define se second
#define M 1000000007
#define MAXN 300001
#define PI acos(-1)
#define INF (1ll<<30)
#define BLOCK_SIZE 425
#define LOG 19
#define BASE 256
#define NAME "file"
#define compare(v) sort((v).begin(), (v).end()); (v).erase(unique((v).begin(), (v).end()), (v).end());
using namespace std;
const ll MOD[] = {(ll)1e9 + 2277, (ll)1e9 + 5277, (ll)1e9 + 8277, (ll)1e9 + 9277, (ll) 1e9 + 7 };
const ll NMOD = 1;
//**Variable**//
ll n, q ;
ll scc ;
ll arr[MAXN];
ll res[MAXN] ;
map<pair<ll,ll>, stack<ll> > mp ;
//**Struct**//
struct Data {
ll u, sz ;
};
stack<Data> his ;
struct Query {
ll u, v, t ;
} que[MAXN];
ll lab[MAXN] ;
ll find_set(ll a ) {
return lab[a] < 0 ? a : find_set(lab[a]);
}
bool union_set(ll u,ll v ) {
u = find_set(u) ;
v = find_set(v) ;
if(u == v ) return false ;
if(lab[u] > lab[v] ) swap(u, v ) ;
his.push({u, lab[u]}) ;
his.push({v, lab[v]}) ;
lab[u] += lab[v] ;
lab[v] = u ;
scc -- ;
return true;
}
void roll_back_dsu() {
if(his.empty() ) return ;
Data u = his.top() ;
his.pop() ;
lab[u.u] = u.sz ;
u = his.top() ;
his.pop() ;
lab[u.u] = u.sz ;
scc ++ ;
}
struct Seg {
vector<pair<ll,ll >> st[MAXN << 2 ] ;
void update(ll id, ll l, ll r, ll u, ll v, pair<ll,ll > key ) {
if(u > r || v < l ) return ;
if(u <= l && v >= r ) {
st[id].push_back(key) ;
return ;
}
ll m = l + r >> 1 ;
update(id << 1, l, m, u, v,key ) ;
update(id << 1 | 1, m + 1, r, u, v, key ) ;
}
void get(ll id, ll l, ll r ) {
ll cnt= 0 ;
for(auto[u, v ] : st[id]) {
if(union_set(u, v )) {
cnt ++ ;
}
}
if(l == r ) {
res[l] = scc ;
FOR(ii, 1, cnt ) roll_back_dsu() ;
return ;
} else {
ll m = l + r >> 1;
get(id << 1, l, m) ;
get(id << 1 | 1, m +1, r ) ;
}
FOR(ii, 1, cnt ) roll_back_dsu() ;
}
} seg;
//**Function**//
void init() {
memset(lab, -1, sizeof lab ) ;
cin>>n >> q ;
scc = n ;
}
void solve() {
// cout << " before " << endl ;
FOR(i, 1, q ) {
ll x, y ;
char type ;
cin >> type ;
if(type == '?') que[i].t = 3;
else if(type == '+') {
cin >> x >> y ;
if(x > y ) swap(x, y ) ;
pair<ll,ll> key = {x, y } ;
mp[key].push(i) ;
} else {
cin >> x >> y ;
if(x > y ) swap(x, y ) ;
pair<ll,ll> key = {x, y } ;
ll pre = mp[key].top() ;
seg.update(1, 0, q, pre, i, key ) ;
mp[key].pop() ;
}
}
for(auto &it : mp ) {
while(!it.se.empty() ) {
seg.update(1, 0, q, it.se.top(), q, it.fi ) ;
it.se.pop() ;
}
}
seg.get(1, 0, q ) ;
FOR(i, 1, q ) if(que[i].t == 3 ) cout << res[i] << el ;
}
_ROOT_ {
// freopen(NAME".inp" , "r" , stdin);
// freopen(NAME".out" , "w", stdout) ;
// ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
srand(time(nullptr)) ;
int t = 1; // cin >> t ;
while(t--) {
init();
solve();
}
return (0&0);
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgbGwgaW50CiNkZWZpbmUgbGQgbG9uZyBkb3VibGUKI2RlZmluZSBlbCAiXG4iCiNkZWZpbmUgX1JPT1RfIGludCBtYWluKCkKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk8yIikKI2RlZmluZSBGT1IoaSxsLHIpIGZvcihpbnQgaSA9IGwgOyBpIDw9IHIgOyBpICsrKQojZGVmaW5lIEZPUkQoaSxyLGwpIGZvcihpbnQgaSA9IHIgOyBpID49IGwgOyBpIC0tKQojZGVmaW5lIFJFUChpLCBhICkgZm9yKGludCBpID0gMCA7IGkgPCBhIDsgaSArKyApCiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBNIDEwMDAwMDAwMDcKI2RlZmluZSBNQVhOIDMwMDAwMQojZGVmaW5lIFBJIGFjb3MoLTEpCiNkZWZpbmUgSU5GICgxbGw8PDMwKQojZGVmaW5lIEJMT0NLX1NJWkUgNDI1CiNkZWZpbmUgTE9HIDE5CiNkZWZpbmUgQkFTRSAyNTYKI2RlZmluZSBOQU1FICJmaWxlIgojZGVmaW5lIGNvbXBhcmUodikgc29ydCgodikuYmVnaW4oKSwgKHYpLmVuZCgpKTsgKHYpLmVyYXNlKHVuaXF1ZSgodikuYmVnaW4oKSwgKHYpLmVuZCgpKSwgKHYpLmVuZCgpKTsKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKY29uc3QgbGwgTU9EW10gPSB7KGxsKTFlOSArIDIyNzcsIChsbCkxZTkgKyA1Mjc3LCAobGwpMWU5ICsgODI3NywgKGxsKTFlOSArIDkyNzcsIChsbCkgMWU5ICsgNyB9Owpjb25zdCBsbCBOTU9EID0gMTsKLy8qKlZhcmlhYmxlKiovLwpsbCBuLCBxIDsKbGwgc2NjIDsKbGwgYXJyW01BWE5dOwpsbCByZXNbTUFYTl0gOwptYXA8cGFpcjxsbCxsbD4sIHN0YWNrPGxsPiA+IG1wIDsKCi8vKipTdHJ1Y3QqKi8vCnN0cnVjdCBEYXRhIHsKICAgIGxsIHUsIHN6IDsKfTsKc3RhY2s8RGF0YT4gaGlzIDsKc3RydWN0IFF1ZXJ5IHsKICAgIGxsIHUsIHYsIHQgOwoKfSBxdWVbTUFYTl07CgpsbCBsYWJbTUFYTl0gOwpsbCBmaW5kX3NldChsbCBhICkgewogICAgcmV0dXJuIGxhYlthXSAgPCAwID8gYSA6IGZpbmRfc2V0KGxhYlthXSk7Cn0KYm9vbCB1bmlvbl9zZXQobGwgdSxsbCB2ICkgewogICAgdSA9IGZpbmRfc2V0KHUpIDsKICAgIHYgPSBmaW5kX3NldCh2KSA7CiAgICBpZih1ID09IHYgKSByZXR1cm4gZmFsc2UgOwogICAgaWYobGFiW3VdID4gbGFiW3ZdICkgc3dhcCh1LCB2ICkgOwogICAgaGlzLnB1c2goe3UsIGxhYlt1XX0pIDsKICAgIGhpcy5wdXNoKHt2LCBsYWJbdl19KSA7CiAgICBsYWJbdV0gKz0gbGFiW3ZdIDsKICAgIGxhYlt2XSA9IHUgOwogICAgc2NjIC0tIDsKICAgIHJldHVybiB0cnVlOwp9CnZvaWQgcm9sbF9iYWNrX2RzdSgpIHsKICAgIGlmKGhpcy5lbXB0eSgpICkgcmV0dXJuIDsKICAgIERhdGEgdSA9IGhpcy50b3AoKSA7CiAgICBoaXMucG9wKCkgOwogICAgbGFiW3UudV0gPSB1LnN6IDsKICAgIHUgPSBoaXMudG9wKCkgOwogICAgaGlzLnBvcCgpIDsKICAgIGxhYlt1LnVdID0gdS5zeiA7CiAgICBzY2MgKysgOwp9CnN0cnVjdCBTZWcgewogICAgdmVjdG9yPHBhaXI8bGwsbGwgPj4gc3RbTUFYTiA8PCAyIF0gOwogICAgdm9pZCB1cGRhdGUobGwgaWQsIGxsIGwsIGxsIHIsIGxsIHUsIGxsIHYsIHBhaXI8bGwsbGwgPiBrZXkgICkgewogICAgICAgIGlmKHUgPiByIHx8IHYgPCBsICkgcmV0dXJuIDsKICAgICAgICBpZih1IDw9IGwgJiYgdiA+PSByICkgewogICAgICAgICAgICBzdFtpZF0ucHVzaF9iYWNrKGtleSkgOwogICAgICAgICAgICByZXR1cm4gOwogICAgICAgIH0KICAgICAgICBsbCBtID0gbCArIHIgPj4gMSA7CiAgICAgICAgdXBkYXRlKGlkIDw8IDEsIGwsIG0sIHUsIHYsa2V5ICkgOwogICAgICAgIHVwZGF0ZShpZCA8PCAxIHwgMSwgbSArIDEsIHIsIHUsIHYsIGtleSApIDsKICAgIH0KCiAgICB2b2lkIGdldChsbCBpZCwgbGwgbCwgbGwgciAgKSB7CiAgICAgICAgbGwgY250PSAgMCA7CgogICAgICAgIGZvcihhdXRvW3UsIHYgXSA6IHN0W2lkXSkgewogICAgICAgICAgICBpZih1bmlvbl9zZXQodSwgdiApKSB7CiAgICAgICAgICAgICAgICBjbnQgKysgOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmKGwgPT0gciApIHsKICAgICAgICAgICAgcmVzW2xdID0gc2NjIDsKICAgICAgICAgICAgRk9SKGlpLCAxLCBjbnQgKSByb2xsX2JhY2tfZHN1KCkgOwogICAgICAgICAgICByZXR1cm4gOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGxsIG0gPSBsICsgciA+PiAxOwogICAgICAgICAgICBnZXQoaWQgPDwgMSwgbCwgbSkgOwogICAgICAgICAgICBnZXQoaWQgPDwgMSB8IDEsICBtICsxLCByICkgOwogICAgICAgIH0KICAgICAgICBGT1IoaWksIDEsIGNudCApIHJvbGxfYmFja19kc3UoKSA7CiAgICB9CgoKfSBzZWc7Ci8vKipGdW5jdGlvbioqLy8KCnZvaWQgaW5pdCgpIHsKICAgIG1lbXNldChsYWIsICAtMSwgc2l6ZW9mIGxhYiApIDsKICAgIGNpbj4+biA+PiBxIDsKICAgIHNjYyA9IG4gOwp9Cgp2b2lkIHNvbHZlKCkgewovLyAgICBjb3V0IDw8ICIgYmVmb3JlICIgPDwgZW5kbCA7CiAgICBGT1IoaSwgMSwgIHEgKSB7CgogICAgICAgIGxsICB4LCB5IDsKICAgICAgICBjaGFyIHR5cGUgOwogICAgICAgIGNpbiA+PiB0eXBlIDsKICAgICAgICBpZih0eXBlID09ICc/JykgcXVlW2ldLnQgPSAzOwogICAgICAgIGVsc2UgaWYodHlwZSA9PSAnKycpIHsKICAgICAgICAgICAgY2luID4+IHggPj4geSA7CiAgICAgICAgICAgIGlmKHggPiB5ICkgc3dhcCh4LCB5ICkgOwogICAgICAgICAgICBwYWlyPGxsLGxsPiBrZXkgPSB7eCwgeSB9IDsKICAgICAgICAgICAgbXBba2V5XS5wdXNoKGkpIDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjaW4gPj4geCA+PiB5IDsKICAgICAgICAgICAgaWYoeCA+IHkgKSBzd2FwKHgsIHkgKSA7CiAgICAgICAgICAgIHBhaXI8bGwsbGw+IGtleSA9IHt4LCB5IH0gOwogICAgICAgICAgICBsbCBwcmUgPSBtcFtrZXldLnRvcCgpIDsKICAgICAgICAgICAgc2VnLnVwZGF0ZSgxLCAwLCBxLCBwcmUsIGksIGtleSApIDsKICAgICAgICAgICAgbXBba2V5XS5wb3AoKSA7CiAgICAgICAgfQogICAgfQogICAgZm9yKGF1dG8gJml0IDogbXAgKSB7CiAgICAgICAgd2hpbGUoIWl0LnNlLmVtcHR5KCkgKSB7CiAgICAgICAgICAgIHNlZy51cGRhdGUoMSwgMCwgcSwgaXQuc2UudG9wKCksIHEsIGl0LmZpICkgOwogICAgICAgICAgICBpdC5zZS5wb3AoKSA7CiAgICAgICAgfQogICAgfQogICAgc2VnLmdldCgxLCAwLCBxICApIDsKICAgIEZPUihpLCAxLCAgcSApIGlmKHF1ZVtpXS50ID09IDMgKSBjb3V0IDw8IHJlc1tpXSA8PCBlbCA7Cn0KCl9ST09UXyB7CiAgICAvLyBmcmVvcGVuKE5BTUUiLmlucCIgLCAiciIgLCBzdGRpbik7CiAgICAvLyBmcmVvcGVuKE5BTUUiLm91dCIgLCAidyIsIHN0ZG91dCkgOwovLyAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOyBjaW4udGllKDApOyBjb3V0LnRpZSgwKTsKICAgIHNyYW5kKHRpbWUobnVsbHB0cikpIDsKICAgIGludCB0ID0gMTsgLy8gY2luID4+IHQgOwogICAgd2hpbGUodC0tKSB7CiAgICAgICAgaW5pdCgpOwogICAgICAgIHNvbHZlKCk7CiAgICB9CiAgICByZXR1cm4gKDAmMCk7Cn0K