#include <bits/stdc++.h>
using namespace std;
#define faster ios_base::sync_with_stdio(false); cin.tie(NULL)
#define Bit(mask , i) ((mask >> i) & 1)
#define fi first
#define se second
#define _LOG2(nl) 31 - __builtin_clz(nl)
#define c_bit(nl) __builtin_popcount(nl)
#define ii pair<int , pair<int , int>>
#define lii pair<long long , pair<int , int>>
#define iii pair<int , pair<int , int>>
#define li pair<long long , long long>
#define db long double
#define onBit(mask , i) (mask | (1 << i))
#define offBit(mask , i) (mask & (~(1 << i)))
#define reverseBit(mask , i) (mask ^ (1 << i))
#define ill pair<int , pair<long long , long long>>
#define lli pair<pair<long long , long long> , pair<int , int>>
const int N = 3e5 + 7;
int n , q , par[N] , sz[N] , rollback_sz[4 * N] , ans[N] , cor;
vector<pair<int , int>> t[4 * N];
struct gv{
int u , v , id;
};
vector<gv> cand;
bool cmp(gv x , gv y){
if (x.u != y.u) return x.u < y.u;
if (x.v != y.v) return x.v < y.v;
return x.id < y.id;
}
void update(int id , int l , int r , int L , int R , int u , int v){
if (l > R || r < L) return;
if (L <= l && r <= R){
t[id].push_back({u , v});
return;
}
int mid = (l + r) >> 1;
update(id << 1 , l , mid , L , R , u , v);
update(id << 1 | 1 , mid + 1 , r , L , R , u , v);
}
void inp(){
cin >> n >> q;
if (q == 0) exit(0);
for (int i = 1 ; i <= n ; ++i){
par[i] = i;
sz[i] = 1;
}
cor = n;
memset(ans , -1 , sizeof ans);
for (int i = 1 ; i <= q ; ++i){
char c;
cin >> c;
if (c == '?'){
ans[i] = 0;
}
else{
int u , v;
cin >> u >> v;
if (u > v) swap(u , v);
cand.push_back({u , v , i});
}
}
sort(cand.begin() , cand.end() , cmp);
int i = 0;
while (i < cand.size()){
int j = i;
while (j < cand.size() - 1 && cand[i].u == cand[j + 1].u && cand[i].v == cand[j + 1].v){
++j;
if ((j - i) % 2 == 1){
update(1 , 1 , q , cand[j - 1].id , cand[j].id - 1 , cand[j].u , cand[j].v);
// cout << cand[j - 1].id << " " << cand[j].id - 1 << " " << cand[j].u << " " << cand[j].v << '\n';
}
}
if ((j - i) % 2 == 0){
update(1 , 1 , q , cand[j].id , q , cand[j].u , cand[j].v);
// cout << cand[j].id << " " << q << " " << cand[j].u << " " << cand[j].v << '\n';
}
i = j + 1;
}
}
int find_par(int u){
if (u == par[u]) return u;
return find_par(par[u]);
}
stack<pair<int , int>> rollback;
void Union(int id , int u , int v){
u = find_par(u) , v = find_par(v);
if (u == v) return;
rollback.push({u , sz[u]});
rollback.push({v , sz[v]});
--cor;
if (sz[v] > sz[u]) swap(u , v);
rollback_sz[id] += 2;
par[v] = u;
sz[u] += sz[v];
}
void get_ans(int id , int l , int r){
for (auto &c : t[id]){
Union(id , c.fi , c.se);
}
if (l == r){
if (ans[l] != -1) ans[l] = cor;
}
else{
int mid = (l + r) >> 1;
get_ans(id << 1 , l , mid);
get_ans(id << 1 | 1 , mid + 1 , r);
}
cor += rollback_sz[id] / 2;
while (rollback_sz[id] > 0){
auto c = rollback.top();
rollback.pop();
par[c.fi] = c.fi;
sz[c.fi] = c.se;
--rollback_sz[id];
}
}
void solve(){
get_ans(1 , 1 , q);
for (int i = 1 ; i <= q ; ++i) if (ans[i] != -1)
cout << ans[i] << '\n';
}
int main(){
freopen("connect.in" , "r" , stdin);
freopen("connect.out" , "w" , stdout);
faster;
inp();
solve();
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgZmFzdGVyIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyBjaW4udGllKE5VTEwpCiNkZWZpbmUgQml0KG1hc2sgLCBpKSAoKG1hc2sgPj4gaSkgJiAxKQojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgX0xPRzIobmwpIDMxIC0gX19idWlsdGluX2NseihubCkKI2RlZmluZSBjX2JpdChubCkgX19idWlsdGluX3BvcGNvdW50KG5sKQojZGVmaW5lIGlpIHBhaXI8aW50ICwgcGFpcjxpbnQgLCBpbnQ+PgojZGVmaW5lIGxpaSBwYWlyPGxvbmcgbG9uZyAsIHBhaXI8aW50ICwgaW50Pj4KI2RlZmluZSBpaWkgcGFpcjxpbnQgLCBwYWlyPGludCAsIGludD4+CiNkZWZpbmUgbGkgcGFpcjxsb25nIGxvbmcgLCBsb25nIGxvbmc+CiNkZWZpbmUgZGIgbG9uZyBkb3VibGUKI2RlZmluZSBvbkJpdChtYXNrICwgaSkgKG1hc2sgfCAoMSA8PCBpKSkKI2RlZmluZSBvZmZCaXQobWFzayAsIGkpIChtYXNrICYgKH4oMSA8PCBpKSkpCiNkZWZpbmUgcmV2ZXJzZUJpdChtYXNrICwgaSkgKG1hc2sgXiAoMSA8PCBpKSkKI2RlZmluZSBpbGwgcGFpcjxpbnQgLCBwYWlyPGxvbmcgbG9uZyAsIGxvbmcgbG9uZz4+CiNkZWZpbmUgbGxpIHBhaXI8cGFpcjxsb25nIGxvbmcgLCBsb25nIGxvbmc+ICwgcGFpcjxpbnQgLCBpbnQ+PgoKY29uc3QgaW50IE4gPSAzZTUgKyA3OwppbnQgbiAsIHEgLCBwYXJbTl0gLCBzeltOXSAsIHJvbGxiYWNrX3N6WzQgKiBOXSAsIGFuc1tOXSAsIGNvcjsKdmVjdG9yPHBhaXI8aW50ICwgaW50Pj4gdFs0ICogTl07CgpzdHJ1Y3QgZ3Z7CiAgICBpbnQgdSAsIHYgLCBpZDsKfTsKCnZlY3Rvcjxndj4gY2FuZDsKCmJvb2wgY21wKGd2IHggLCBndiB5KXsKICAgIGlmICh4LnUgIT0geS51KSByZXR1cm4geC51IDwgeS51OwogICAgaWYgKHgudiAhPSB5LnYpIHJldHVybiB4LnYgPCB5LnY7CiAgICByZXR1cm4geC5pZCA8IHkuaWQ7Cn0KCnZvaWQgdXBkYXRlKGludCBpZCAsIGludCBsICwgaW50IHIgLCBpbnQgTCAsIGludCBSICwgaW50IHUgLCBpbnQgdil7CiAgICBpZiAobCA+IFIgfHwgciA8IEwpIHJldHVybjsKICAgIGlmIChMIDw9IGwgJiYgciA8PSBSKXsKICAgICAgICB0W2lkXS5wdXNoX2JhY2soe3UgLCB2fSk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGludCBtaWQgPSAobCArIHIpID4+IDE7CiAgICB1cGRhdGUoaWQgPDwgMSAsIGwgLCBtaWQgLCBMICwgUiAsIHUgLCB2KTsKICAgIHVwZGF0ZShpZCA8PCAxIHwgMSAsIG1pZCArIDEgLCByICwgTCAsIFIgLCB1ICwgdik7Cn0KCnZvaWQgaW5wKCl7CiAgICBjaW4gPj4gbiA+PiBxOwogICAgaWYgKHEgPT0gMCkgZXhpdCgwKTsKCiAgICBmb3IgKGludCBpID0gMSA7IGkgPD0gbiA7ICsraSl7CiAgICAgICAgcGFyW2ldID0gaTsKICAgICAgICBzeltpXSA9IDE7CiAgICB9CiAgICBjb3IgPSBuOwoKICAgIG1lbXNldChhbnMgLCAtMSAsIHNpemVvZiBhbnMpOwogICAgZm9yIChpbnQgaSA9IDEgOyBpIDw9IHEgOyArK2kpewogICAgICAgIGNoYXIgYzsKICAgICAgICBjaW4gPj4gYzsKICAgICAgICBpZiAoYyA9PSAnPycpewogICAgICAgICAgICBhbnNbaV0gPSAwOwogICAgICAgIH0KCiAgICAgICAgZWxzZXsKICAgICAgICAgICAgaW50IHUgLCB2OwogICAgICAgICAgICBjaW4gPj4gdSA+PiB2OwogICAgICAgICAgICBpZiAodSA+IHYpIHN3YXAodSAsIHYpOwogICAgICAgICAgICBjYW5kLnB1c2hfYmFjayh7dSAsIHYgLCBpfSk7CiAgICAgICAgfQogICAgfQoKICAgIHNvcnQoY2FuZC5iZWdpbigpICwgY2FuZC5lbmQoKSAsIGNtcCk7CgogICAgaW50IGkgPSAwOwogICAgd2hpbGUgKGkgPCBjYW5kLnNpemUoKSl7CiAgICAgICAgaW50IGogPSBpOwogICAgICAgIHdoaWxlIChqIDwgY2FuZC5zaXplKCkgLSAxICYmIGNhbmRbaV0udSA9PSBjYW5kW2ogKyAxXS51ICYmIGNhbmRbaV0udiA9PSBjYW5kW2ogKyAxXS52KXsKICAgICAgICAgICAgKytqOwogICAgICAgICAgICBpZiAoKGogLSBpKSAlIDIgPT0gMSl7CiAgICAgICAgICAgICAgICB1cGRhdGUoMSAsIDEgLCBxICwgY2FuZFtqIC0gMV0uaWQgLCBjYW5kW2pdLmlkIC0gMSAsIGNhbmRbal0udSAsIGNhbmRbal0udik7Ci8vICAgICAgICAgICAgICAgIGNvdXQgPDwgY2FuZFtqIC0gMV0uaWQgPDwgIiAiIDw8IGNhbmRbal0uaWQgLSAxIDw8ICIgIiA8PCBjYW5kW2pdLnUgPDwgIiAiIDw8IGNhbmRbal0udiA8PCAnXG4nOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoKGogLSBpKSAlIDIgPT0gMCl7CiAgICAgICAgICAgIHVwZGF0ZSgxICwgMSAsIHEgLCBjYW5kW2pdLmlkICwgcSAsIGNhbmRbal0udSAsIGNhbmRbal0udik7Ci8vICAgICAgICAgICAgY291dCA8PCBjYW5kW2pdLmlkIDw8ICIgIiA8PCBxIDw8ICIgIiA8PCBjYW5kW2pdLnUgPDwgIiAiIDw8IGNhbmRbal0udiA8PCAnXG4nOwogICAgICAgIH0KCiAgICAgICAgaSA9IGogKyAxOwogICAgfQp9CgppbnQgZmluZF9wYXIoaW50IHUpewogICAgaWYgKHUgPT0gcGFyW3VdKSByZXR1cm4gdTsKICAgIHJldHVybiBmaW5kX3BhcihwYXJbdV0pOwp9CgpzdGFjazxwYWlyPGludCAsIGludD4+IHJvbGxiYWNrOwoKdm9pZCBVbmlvbihpbnQgaWQgLCBpbnQgdSAsIGludCB2KXsKICAgIHUgPSBmaW5kX3Bhcih1KSAsIHYgPSBmaW5kX3Bhcih2KTsKICAgIGlmICh1ID09IHYpIHJldHVybjsKICAgIAogICAgcm9sbGJhY2sucHVzaCh7dSAsIHN6W3VdfSk7CiAgICByb2xsYmFjay5wdXNoKHt2ICwgc3pbdl19KTsKCiAgICAtLWNvcjsKICAgIGlmIChzelt2XSA+IHN6W3VdKSBzd2FwKHUgLCB2KTsKICAgIHJvbGxiYWNrX3N6W2lkXSArPSAyOwogICAgcGFyW3ZdID0gdTsKICAgIHN6W3VdICs9IHN6W3ZdOwp9Cgp2b2lkIGdldF9hbnMoaW50IGlkICwgaW50IGwgLCBpbnQgcil7CiAgICBmb3IgKGF1dG8gJmMgOiB0W2lkXSl7CiAgICAgICAgVW5pb24oaWQgLCBjLmZpICwgYy5zZSk7CiAgICB9CgogICAgaWYgKGwgPT0gcil7CiAgICAgICAgaWYgKGFuc1tsXSAhPSAtMSkgYW5zW2xdID0gY29yOwogICAgfQoKICAgIGVsc2V7CiAgICAgICAgaW50IG1pZCA9IChsICsgcikgPj4gMTsKICAgICAgICBnZXRfYW5zKGlkIDw8IDEgLCBsICwgbWlkKTsKICAgICAgICBnZXRfYW5zKGlkIDw8IDEgfCAxICwgbWlkICsgMSAsIHIpOwogICAgfQoKICAgIGNvciArPSByb2xsYmFja19zeltpZF0gLyAyOwogICAgd2hpbGUgKHJvbGxiYWNrX3N6W2lkXSA+IDApewogICAgICAgIGF1dG8gYyA9IHJvbGxiYWNrLnRvcCgpOwogICAgICAgIHJvbGxiYWNrLnBvcCgpOwoKICAgICAgICBwYXJbYy5maV0gPSBjLmZpOwogICAgICAgIHN6W2MuZmldID0gYy5zZTsKICAgICAgICAtLXJvbGxiYWNrX3N6W2lkXTsKICAgIH0KfQoKdm9pZCBzb2x2ZSgpewogICAgZ2V0X2FucygxICwgMSAsIHEpOwogICAgZm9yIChpbnQgaSA9IDEgOyBpIDw9IHEgOyArK2kpIGlmIChhbnNbaV0gIT0gLTEpCiAgICAgICAgY291dCA8PCBhbnNbaV0gPDwgJ1xuJzsKfQoKaW50IG1haW4oKXsKICAgIGZyZW9wZW4oImNvbm5lY3QuaW4iICwgInIiICwgc3RkaW4pOwogICAgZnJlb3BlbigiY29ubmVjdC5vdXQiICwgInciICwgc3Rkb3V0KTsKICAgIGZhc3RlcjsKICAgIGlucCgpOwogICAgc29sdmUoKTsKICAgIHJldHVybiAwOwp9Cg==