#include <bits/stdc++.h>
using namespace std;
const int N = 3000000 + 11;
const int mod = 1e9 + 7;
const int MAXN = 3000000 + 5;
int n, m;
int c[MAXN];
struct Node {
  int l, r;
} a[MAXN];
int lowbit(int i) { return i & (-i); }
long long sum(int x) {
  long long sum = 0;
  while (x) {
    sum += c[x];
    x -= lowbit(x);
  }
  return sum;
}
void add(int x, long long val) {
  while (x <= n) {
    c[x] += val;
    x += lowbit(x);
  }
}
int two_query(int x) {
  int l = 1, r = n;
  while (l < r) {
    int mid = (l + r) >> 1;
    if (sum(mid) >= x) {
      r = mid;
    } else
      l = mid + 1;
  }
  return l;
}
long long p[100];
int lim;
void bz_init() {
  p[0] = 1;
  for (int i = 1; i < 30; i++) p[i] = p[i - 1] << 1;
  lim = log(n) / log(2) + 1;
}
int bz_query(int x) {
  int ans = 0, sum = 0;
  for (int j = lim; j >= 0; j--) {
    if (ans + p[j] <= n && sum + c[ans + p[j]] < x) {
      sum += c[ans + p[j]];
      ans += p[j];
    }
  }
  return ans + 1;
}
int f[N];
char ans[N], s[N];
int main() {
  scanf("%s", s + 1);
  scanf("%d%d", &n, &m);
  memset(c, 0, sizeof(c));
  for (int i = 1; i <= n; i++) {
    add(i, 1);
  }
  for (int i = 1; i <= m; i++) {
    scanf("%d%d", &a[i].l, &a[i].r);
  }
  bz_init();
  for (int now = n, i = m; i >= 1; i--) {
    for (int x = a[i].l + 1, j = 1; a[i].r < now && j <= a[i].r - a[i].l + 1;
         x += 2, j++, now--) {
      if (x > a[i].r) x = a[i].l;
      int pos = bz_query(a[i].r + 1);
      add(pos, -1);
      f[pos] = bz_query(x);
    }
  }
  for (int i = 1, j = 0; i <= n; i++) {
    if (f[i] != 0)
      ans[i] = ans[f[i]];
    else
      ans[i] = s[++j];
  }
  printf("%s", ans + 1);
  return 0;
}
