#include <bits/stdc++.h>
using namespace std;
string S;
int K, N;
pair<int, int> seg[5010];
char ans[3000010];
struct node {
  int l, r, sz;
  node *nxt;
  node() { l = -1, r = -1, sz = -1, nxt = NULL; }
};
node *head;
void add(node *x, node *y) {
  y->nxt = x->nxt;
  x->nxt = y;
}
void split(node *x, int k) {
  node *y = new node();
  add(x, y);
  y->sz = x->sz - k;
  x->sz = k;
}
pair<node *, int> Find(int x) {
  node *curr = head;
  int sum = 0;
  while (sum + curr->sz < x) {
    sum += curr->sz;
    curr = curr->nxt;
  }
  return {curr, x - sum - 1};
}
void print(node *x) {
  cout << "print\n";
  node *y = x;
  while (1) {
    cout << y->l << ' ' << y->r << endl;
    if (y->nxt)
      y = y->nxt;
    else
      break;
  }
}
void build(int k, int idx) {
  if (idx == -1) {
    head = new node();
    head->sz = k;
    return;
  }
  int l = seg[idx].first;
  int r = seg[idx].second;
  if (r + 1 >= k) {
    build(k, idx - 1);
    return;
  }
  if (2 * r - l + 2 > k) {
    build(r + 1, idx - 1);
    node *curr = head;
    while (curr->nxt) curr = curr->nxt;
    curr->nxt = new node();
    curr->nxt->sz = k - r - 1;
  } else {
    build(k - r + l - 1, idx - 1);
    node *curr = head;
    int sum = 0;
    while (sum + curr->sz < r + 1) {
      sum += curr->sz;
      curr = curr->nxt;
    }
    if (curr->sz > r + 1 - sum) split(curr, r + 1 - sum);
    node *tmp = new node();
    tmp->sz = r - l + 1;
    add(curr, tmp);
  }
}
void solve(int k, int idx) {
  if (idx == -1) {
    node *curr = head;
    int pos = 0;
    for (int i = 0; i < k; i++) {
      if (curr->l + pos > curr->r) curr = curr->nxt, pos = 0;
      ans[curr->l + pos++] = S[i];
    }
    return;
  }
  int l = seg[idx].first;
  int r = seg[idx].second;
  if (r + 1 >= k) {
    solve(k, idx - 1);
    return;
  }
  vector<char> arr;
  int cnt, rem;
  pair<node *, int> z = Find(r + 1);
  if (2 * r - l + 2 > k) {
    node *L = z.first;
    node *R = Find(k).first;
    node *tmp = L->nxt;
    L->nxt = R->nxt;
    solve(r + 1, idx - 1);
    L->nxt = tmp;
    cnt = rem = k - r - 1;
  } else {
    node *L = z.first;
    node *R = Find(2 * r - l + 2).first;
    node *tmp = L->nxt;
    L->nxt = R->nxt;
    solve(k - r + l - 1, idx - 1);
    L->nxt = tmp;
    cnt = rem = r - l + 1;
  }
  pair<node *, int> x = Find(l + 1);
  pair<node *, int> y = x;
  x.second++;
  for (int i = l + 1; i <= r; i++) {
    if (!rem) break;
    if (x.first->l + x.second > x.first->r)
      x.first = x.first->nxt, x.second = 0;
    if (i % 2 == (l + 1) % 2)
      arr.push_back(ans[x.first->l + x.second++]), rem--;
    else
      x.second++;
  }
  x = y;
  for (int i = l; i <= r; i++) {
    if (!rem) break;
    if (x.first->l + x.second > x.first->r)
      x.first = x.first->nxt, x.second = 0;
    if (i % 2 == l % 2)
      arr.push_back(ans[x.first->l + x.second++]), rem--;
    else
      x.second++;
  }
  x = z;
  x.second++;
  for (int i = 0; i < cnt; i++) {
    if (x.first->l + x.second > x.first->r)
      x.first = x.first->nxt, x.second = 0;
    ans[x.first->l + x.second++] = arr[i];
  }
}
int main() {
  getline(cin, S);
  cin >> K >> N;
  for (int i = 0; i < N; i++) {
    int l, r;
    scanf("%d %d", &l, &r);
    l--;
    r--;
    seg[i] = {l, r};
  }
  build(K, N - 1);
  node *curr = head;
  int sum = 0;
  while (1) {
    curr->l = sum;
    curr->r = curr->l + curr->sz - 1;
    sum += curr->r - curr->l + 1;
    if (curr->nxt)
      curr = curr->nxt;
    else
      break;
  }
  solve(K, N - 1);
  for (int i = 0; i < K; i++) {
    printf("%c", ans[i]);
  }
}
