#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
inline int read() {
int x=0,f=0,ch=getchar();
while(!isdigit(ch)) f|=ch=='-',ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return f?-x:x;
}
const int N=1e5+5;
int n,m;
int h=1;
int S=800;
int cnt;
int g[N];
int tot;
struct Block_list {
vector<int>a[N];
bool p[N];
int nxt[N];
void pre() {
for(int i=1;i<=n;i++) {
a[i/S+1].push_back(i);
}
a[n/S+1].push_back(INF);
for(int i=1;i<n/S+1;i++) {
nxt[i]=i+1;
}
cnt=n/S+1;
}
int get(int x,int k) {
if(!p[x]) return k;
return a[x].size()-k-1;
}
int val(int x,int k) {
return a[x][get(x,k)];
}
pair<int,int> pos(int x) {
int sum=0;
for(int i=h;i;i=nxt[i]) {
if(sum+a[i].size()>=x) {
return make_pair(i,x-sum-1);
}
else sum+=a[i].size();
}
}
void put() {
for(int i=h;i;i=nxt[i]) {
for(int j=0;j<a[i].size();j++) {
if(val(i,j)!=INF)
printf("%d ",val(i,j));
}
}
}
void tp(int x) {
if(!p[x]) return ;
reverse(a[x].begin(),a[x].end());
p[x]=false;
}
void split(int x,int d) {
tp(x);
++cnt;
for(int i=d;i<a[x].size();i++) a[cnt].push_back(a[x][i]);
while(a[x].size()>d) a[x].pop_back();
nxt[cnt]=nxt[x];
nxt[x]=cnt;
}
void merge(int x,int y) {
if(a[x].size()+a[y].size()>S*3/2) return ;
tp(x),tp(y);
nxt[x]=nxt[y];
a[x].insert(a[x].end(),a[y].begin(),a[y].end());
a[y].clear();
}
void balance() {
for(int i=h;i;i=nxt[i]) {
if(a[i].size()>2*S) split(i,S);
if(nxt[i]) merge(i,nxt[i]);
}
}
void rev(int l,int r) {
pair<int,int> L=pos(l);
pair<int,int> R=pos(r);
if(L.first==R.first) {
int t=L.first;
for(int i=L.second,j=R.second;i<j;i++,--j) {
swap(a[t][get(t,i)],a[t][get(t,j)]);
}
return ;
}
split(L.first,L.second);
split(R.first,R.second+1);
tot=0;
for(int i=nxt[L.first];i!=nxt[R.first];i=nxt[i]) {
g[++tot]=i;
p[i]=!p[i];
}
nxt[L.first]=R.first;
nxt[g[1]]=nxt[R.first];
for(int i=tot;i>1;--i) nxt[g[i]]=g[i-1];
balance();
}
}t;
int main() {
n=read();
m=read();
t.pre();
while(m--) {
int l=read(),r=read();
t.rev(l,r);
}
t.put();
return 0;
}