#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
using namespace std;
using namespace __gnu_pbds;
#define g0(x) get<0>(x)
#define g1(x) get<1>(x)
#define g2(x) get<2>(x)
#define mt make_tuple
#define mp make_pair
#define pb push_back
#define int long long
#define f first
#define s second
#define pll pair<long long, long long>
#define iii tuple<int,int,int>
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
int n,m;cin>>n>>m;
vector<set<pll>> out(n), in(n);
vector<bool> vis(m, 0);
vector<pll> ed(m);
vector<int> belong(m, -1);
for(int i=0;i<m;i++){
int x, y;cin>>x>>y;
out[y].insert({i, x});
in[x].insert({i, y});
ed[i]={x, y};
}
/*for(int i=0;i<n;i++){
sort(all(out[i]));
sort(all(in[i]));
}*/
for(int i=m-1;i>=0;i--){
if(vis[i])continue;
map<int,int> freq;
set<pair<int,int>> best;
vis[i]=1;
auto dfs=[&](auto && dfs, int x, int pn, int pe1, int pe2)->void{
/*printf("at node x %lld, pn %lld, pe1 %lld, pe2 %lld\n",
x, pn, pe1, pe2);*/
assert(pn == ed[pe1].f);
best.erase(mp(freq[pn], pn));
freq[pn]+=pe2-pe1;
best.insert(mp(freq[pn], pn));
int most=(*prev(best.end())).f;
belong[pe1]=(*best.lower_bound(mp(most, (int)-1))).s;
auto it = in[x].lower_bound(mp(pe1, 1ll));
while(it != in[x].begin()){
it = prev(it);
auto [et, to]=*it;
assert(vis[et] == 0);
auto chk=lower_bound(all(out[x]), mp(et, (int)-1));
if(chk == out[x].end() or (*chk).f != pe1){
break;
}
vis[et]=1;
dfs(dfs, to, x, et, pe1);
in[x].erase(it);
it=in[x].lower_bound(mp(pe1, 1ll));
}
best.erase(mp(freq[pn], pn));
freq[pn]-=pe2-pe1;
best.insert(mp(freq[pn], pn));
};
dfs(dfs, ed[i].s, ed[i].f, i, m);
}
vector<int> ans(n, 0);
for(int i=0;i<m;i++){
assert(belong[i] != -1);
ans[belong[i]]++;
}
for(int i=0;i<n;i++){
cout<<ans[i]<<" ";
}
}