//NiceDuck
#include "bits/stdc++.h"
typedef long long ll;
using namespace std;
#define FILE "000"
#define foru(i,a,b) for(int i=(int)(a); i<=(int)(b); ++i)
#define ford(i,a,b) for(int i=(int)(a); i>=(int)(b); --i)
#define fastio ios_base::sync_with_stdio(0);cin.tie(0);
#define pb push_back
#define fi first
#define se second
#define el "\n"
#define MASK(i) (1LL<<(i))
#define BIT(i,j) (((i)>>(j))&1)
#define TIME 1.0*clock()/CLOCKS_PER_SEC
#define LOG 20
const ll MAX=2e5+5;
int n,q,cnt;
struct Dsu
{
vector<pair<int,int> > history;
int par[MAX],sz[MAX];
void init()
{
foru(i,1,n)
{
par[i]=i;
sz[i]=1;
}
}
int find_par(int x)
{
while(x!=par[x]) x=par[x];
return x;
}
int join(int u, int v)
{
u=find_par(u); v=find_par(v);
if(u==v)
{
history.pb({-1,-1});
return 0;
}
if(sz[u]<sz[v]) swap(u,v);
history.pb({v,sz[u]});
sz[u]+=sz[v];
par[v]=u;
return -1;
}
int rollback(int ver)
{
int res=0;
while((int)history.size()>ver)
{
pair<int,int> pa=history.back();
history.pop_back();
if(pa.fi==-1) continue;
int v=pa.fi, old=pa.se;
int u=par[v];
sz[u]=old;
par[v]=v;
++res;
}
return res;
}
} dsu;
int main()
{
fastio
if(fopen(FILE ".inp","r"))
{
freopen(FILE ".inp","r",stdin); freopen(FILE ".out","w",stdout);
}
cin>>n>>q;
cnt=n;
dsu.init();
cin.ignore();
vector<int> v;
v.clear();
while(q--)
{
string str; cin>>str;
if(str=="persist") v.pb(dsu.history.size());
else if(str=="union")
{
int u,v; cin>>u>>v;
cnt+=dsu.join(u,v);
cout<<cnt<<el;
}
else
{
int x=v.back();
cnt+=dsu.rollback(x);
cout<<cnt<<el;
v.pop_back();
}
}
return 0;
}
Ly9OaWNlRHVjawojaW5jbHVkZSAiYml0cy9zdGRjKysuaCIKdHlwZWRlZiBsb25nIGxvbmcgbGw7CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgRklMRSAiMDAwIgojZGVmaW5lIGZvcnUoaSxhLGIpIGZvcihpbnQgaT0oaW50KShhKTsgaTw9KGludCkoYik7ICsraSkKI2RlZmluZSBmb3JkKGksYSxiKSBmb3IoaW50IGk9KGludCkoYSk7IGk+PShpbnQpKGIpOyAtLWkpCiNkZWZpbmUgZmFzdGlvIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7Y2luLnRpZSgwKTsKI2RlZmluZSBwYiBwdXNoX2JhY2sKI2RlZmluZSBmaSBmaXJzdAojZGVmaW5lIHNlIHNlY29uZAojZGVmaW5lIGVsICJcbiIKI2RlZmluZSBNQVNLKGkpICgxTEw8PChpKSkKI2RlZmluZSBCSVQoaSxqKSAoKChpKT4+KGopKSYxKQojZGVmaW5lIFRJTUUgMS4wKmNsb2NrKCkvQ0xPQ0tTX1BFUl9TRUMKI2RlZmluZSBMT0cgMjAKCmNvbnN0IGxsIE1BWD0yZTUrNTsKaW50IG4scSxjbnQ7CnN0cnVjdCBEc3UKewogICAgdmVjdG9yPHBhaXI8aW50LGludD4gPiBoaXN0b3J5OwogICAgaW50IHBhcltNQVhdLHN6W01BWF07CiAgICB2b2lkIGluaXQoKQogICAgewogICAgICAgIGZvcnUoaSwxLG4pCiAgICAgICAgewogICAgICAgICAgICBwYXJbaV09aTsKICAgICAgICAgICAgc3pbaV09MTsKICAgICAgICB9CiAgICB9CiAgICBpbnQgZmluZF9wYXIoaW50IHgpCiAgICB7CiAgICAgICAgd2hpbGUoeCE9cGFyW3hdKSB4PXBhclt4XTsKICAgICAgICByZXR1cm4geDsKICAgIH0KICAgIGludCBqb2luKGludCB1LCBpbnQgdikKICAgIHsKICAgICAgICB1PWZpbmRfcGFyKHUpOyB2PWZpbmRfcGFyKHYpOwogICAgICAgIGlmKHU9PXYpCiAgICAgICAgewogICAgICAgICAgICBoaXN0b3J5LnBiKHstMSwtMX0pOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgaWYoc3pbdV08c3pbdl0pIHN3YXAodSx2KTsKICAgICAgICBoaXN0b3J5LnBiKHt2LHN6W3VdfSk7CiAgICAgICAgc3pbdV0rPXN6W3ZdOwogICAgICAgIHBhclt2XT11OwogICAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIGludCByb2xsYmFjayhpbnQgdmVyKQogICAgewogICAgICAgIGludCByZXM9MDsKICAgICAgICB3aGlsZSgoaW50KWhpc3Rvcnkuc2l6ZSgpPnZlcikKICAgICAgICB7CiAgICAgICAgICAgIHBhaXI8aW50LGludD4gcGE9aGlzdG9yeS5iYWNrKCk7CiAgICAgICAgICAgIGhpc3RvcnkucG9wX2JhY2soKTsKICAgICAgICAgICAgaWYocGEuZmk9PS0xKSBjb250aW51ZTsKICAgICAgICAgICAgaW50IHY9cGEuZmksIG9sZD1wYS5zZTsKICAgICAgICAgICAgaW50IHU9cGFyW3ZdOwogICAgICAgICAgICBzelt1XT1vbGQ7CiAgICAgICAgICAgIHBhclt2XT12OwogICAgICAgICAgICArK3JlczsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlczsKICAgIH0KfSBkc3U7CgppbnQgbWFpbigpCnsKICAgIGZhc3RpbwogICAgaWYoZm9wZW4oRklMRSAiLmlucCIsInIiKSkKICAgIHsKICAgICAgICBmcmVvcGVuKEZJTEUgIi5pbnAiLCJyIixzdGRpbik7IGZyZW9wZW4oRklMRSAiLm91dCIsInciLHN0ZG91dCk7CiAgICB9CiAgICBjaW4+Pm4+PnE7CiAgICBjbnQ9bjsKICAgIGRzdS5pbml0KCk7CiAgICBjaW4uaWdub3JlKCk7CiAgICB2ZWN0b3I8aW50PiB2OwogICAgdi5jbGVhcigpOwogICAgd2hpbGUocS0tKQogICAgewogICAgICAgIHN0cmluZyBzdHI7IGNpbj4+c3RyOwogICAgICAgIGlmKHN0cj09InBlcnNpc3QiKSB2LnBiKGRzdS5oaXN0b3J5LnNpemUoKSk7CiAgICAgICAgZWxzZSBpZihzdHI9PSJ1bmlvbiIpCiAgICAgICAgewogICAgICAgICAgICBpbnQgdSx2OyBjaW4+PnU+PnY7CiAgICAgICAgICAgIGNudCs9ZHN1LmpvaW4odSx2KTsKICAgICAgICAgICAgY291dDw8Y250PDxlbDsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgaW50IHg9di5iYWNrKCk7CiAgICAgICAgICAgIGNudCs9ZHN1LnJvbGxiYWNrKHgpOwogICAgICAgICAgICBjb3V0PDxjbnQ8PGVsOwogICAgICAgICAgICB2LnBvcF9iYWNrKCk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDA7Cn0K