#include <stdio.h>
#define TMAX (1<<20)
char buff[9500010];
int N, M, T[2*TMAX], K[2*TMAX], V[TMAX], P, Q, Max, Pmax, X;
FILE *f;
void read()
{
int i;
f = fopen("elimin.in", "r");
setbuffer(f, buff, sizeof(buff));
fscanf(f, "%d %d", &N, &M);
for (i = 1; i <= N; i++)
fscanf(f,"%d",V+i);
}
void update(int x, int val)
{
int nod = TMAX+x, l;
T[nod] = x;
K[nod] = 1;
if (val<0) K[nod] = 0;
while (nod>1)
{
nod = nod>>1;
l = nod<<1;
T[nod] = T[l];
if (V[ T[l] ] < V[ T[l+1] ]) T[nod] = T[l+1];
K[nod] += val;
}
}
void query(int p, int q, int nod)
{
int md = (p+q)>>1, l = nod<<1;
if (P <= p && q <= Q)
{
if (V[ T[nod] ]>Max) Max = V[ T[nod] ], Pmax = T[nod];
return;
}
if ( (p<=P&&P<=q) || (p<=Q&&Q<=q) )
{
query(p,md,l);
query(md+1,q,l+1);
}
}
void getnew(int x, int p, int q, int nod)
{
int md = (p+q)>>1, l = nod<<1;
if (p==q) { X = p; return; }
if (K[l]==x) { X = md; return; }
if (K[l]>x) getnew(x,p,md,l);
if (K[l]<x) getnew(x-K[l],md+1,q,l+1);
if (X>=0) return;
}
void solve()
{
int i, j;
for (i = 1; i <= N; i++) update(i,1);
while (M--)
{
fscanf(f,"%d%d",&i,&j);
X = -1; getnew(i,0,TMAX-1,1); P = X;
X = -1; getnew(j,0,TMAX-1,1); Q = X;
Max = 0; Pmax = -1;
query(0,TMAX-1,1);
V[Pmax] = -1;
update(Pmax,-1);
}
}
void write()
{
int i;
freopen("elimin.out", "w", stdout);
for (i = 1; i <= N; i++)
if (V[i]>=0) printf("%d\n", V[i]);
}
int main()
{
read();
solve();
write();
return 0;
}