#include<iostream>
#include <string>
#define mn 100010
#define ls x<<1|1
#define rs x<<1
using namespace std;
struct node
{
int l,r;
int ch[27];
int tag;
}tr[mn<<2];
int n,m;
inline void pushup(int x)
{
for(int i=1;i<=26;++i)tr[x].ch[i]=tr[ls].ch[i]+tr[rs].ch[i];
}
inline void pushdown(int x)
{
if(!tr[x].tag)return;
for(int i=1;i<=26;++i)tr[ls].ch[i]=tr[rs].ch[i]=0;
tr[ls].tag=tr[x].tag,tr[rs].tag=tr[x].tag;
tr[ls].ch[tr[ls].tag]=tr[ls].r-tr[ls].l+1;
tr[rs].ch[tr[rs].tag]=tr[rs].r-tr[rs].l+1;
tr[x].tag=0;
}
inline void build(int x,int l,int r)
{
tr[x].l=l,tr[x].r=r;
for(int i=1;i<=26;++i)tr[x].ch[i]=0;
char c;
if(l==r)
{
cin>>c;
tr[x].ch[c-'a'+1]=1;
return;
}
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
pushup(x);
}
int num[27];
inline bool check(int l,int r)
{
bool flag=0;
for(int i=1;i<=26;++i)
if(num[i]&1)
{
if(flag || (r-l+1)%2==0)return 1;
flag=1;
}
return 0;
}
inline void query(int x,int l,int r)
{
if(l>tr[x].r || r<tr[x].l)return;
if(l<=tr[x].l && tr[x].r<=r)
{
for(int i=1;i<=26;++i)num[i]+=tr[x].ch[i];
return;
}
pushdown(x);
query(ls,l,r);
query(rs,l,r);
}
inline void update(int x,int l,int r,int k)
{
if(l>tr[x].r || r<tr[x].l)return;
if(l<=tr[x].l && tr[x].r<=r)
{
for(int i=1;i<=26;++i)tr[x].ch[i]=0;
tr[x].tag=k;
tr[x].ch[k]=tr[x].r-tr[x].l+1;
return ;
}
pushdown(x);
int mid=(l+r)>>1;
update(ls,l,r,k);
update(rs,l,r,k);
pushup(x);
}
inline void print(int x,int l,int r)
{
if(l==r)
{
for(int i=1;i<=26;++i)
if(tr[x].ch[i])
{
cout<<char(i+'a'-1);
break;
}
return;
}
int mid=(l+r)>>1;
print(ls,l,mid);
print(rs,mid+1,r);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
cin>>n>>m;
build(1,1,n);
int l,r;
while(m--)
{
cin>>l>>r;
for(int i=1;i<=26;++i)num[i]=0;
query(1,l,r);
if(check(l,r))continue;
for(int i=1;i<=26;++i)
{
if(!num[i])continue;
if(num[i]&1)update(1,(l+r)/2,(l+r)/2,i);
update(1,l,l+num[i]/2-1,i);
update(1,r-num[i]/2+1,r,i);
l+=num[i]/2;
r-=num[i]/2;
}
}
print(1,1,n);
return 0;
}