#include <bits/stdc++.h>
using namespace std;
const int Maxn = 3e6 + 10;
char str[Maxn], ans[Maxn];
struct Node {
  int from, to, sum;
  Node() {}
  Node(int from, int to, int sum) : from(from), to(to), sum(sum) {}
} node[Maxn << 2];
int len;
int k, n;
int a[5010], b[5010];
int pa[Maxn];
void build(int p, int from, int to) {
  node[p] = Node(from, to, to - from + 1);
  if (from == to) return;
  int mid = (from + to) >> 1;
  build(p << 1, from, mid);
  build(p << 1 | 1, mid + 1, to);
}
void update(int p) { node[p].sum = node[p << 1].sum + node[p << 1 | 1].sum; }
int insert(int p, int v) {
  if (node[p].from == node[p].to) {
    assert(v == 1);
    node[p].sum--;
    return node[p].from;
  }
  int sum = node[p << 1].sum;
  int ret;
  if (sum >= v)
    ret = insert(p << 1, v);
  else
    ret = insert(p << 1 | 1, v - sum);
  update(p);
  return ret;
}
int search(int p, int x) {
  if (node[p].from == node[p].to) {
    assert(x == 1);
    return node[p].from;
  }
  int sum = node[p << 1].sum;
  if (x <= sum)
    return search(p << 1, x);
  else
    return search(p << 1 | 1, x - sum);
}
int main() {
  scanf("%s", str + 1);
  len = strlen(str + 1);
  ;
  scanf("%d%d", &k, &n);
  build(1, 1, k);
  for (int i = 0; i < n; ++i) scanf("%d%d", a + i, b + i);
  memset(pa, -1, sizeof(pa));
  for (int i = n - 1; i >= 0; --i) {
    int now = a[i] + 1;
    for (int j = 0; j < b[i] - a[i] + 1; ++j) {
      if (b[i] + 1 > node[1].sum) break;
      int ind = insert(1, b[i] + 1);
      if (now > b[i]) now = a[i];
      pa[ind] = search(1, now);
      now += 2;
    }
  }
  for (int i = 1, j = 1; i <= k; ++i)
    if (pa[i] != -1)
      ans[i] = ans[pa[i]];
    else
      ans[i] = str[j++];
  ans[k + 1] = '\0';
  printf("%s\n", ans + 1);
  return 0;
}
