#include <bits/stdc++.h>
using namespace std;
enum { MAXC = 3001000, MAXN = 5010 };
char str[MAXC], ns[MAXC];
int L[MAXN], R[MAXN], clen[MAXN];
struct Splay {
  struct node {
    node *ch[2], *f;
    int size;
    char key;
    void push_up() { size = ch[0]->size + ch[1]->size + 1; }
    bool dir() { return f->ch[1] == this; }
    void rotate() {
      node *fath = f;
      bool c = dir();
      ch[!c]->f = fath;
      fath->ch[c] = ch[!c];
      fath->push_up();
      f = fath->f;
      if (f != NULL) f->ch[fath->dir()] = this;
      fath->f = this;
      ch[!c] = fath;
    }
  } buffer[MAXC], *nil, *top, *root;
  node *new_node(node *lson, node *rson, char key) {
    top->ch[0] = lson;
    top->ch[1] = rson;
    top->f = NULL;
    top->key = key;
    top->push_up();
    lson->f = rson->f = top;
    return top++;
  }
  Splay() : nil(new node), top(buffer), root(NULL) {
    nil->ch[0] = nil->ch[1] = nil;
    nil->size = 0;
  }
  void push_up_root(node *x) {
    for (; x != NULL; x->push_up(), x = x->f)
      ;
  }
  void splay(node *x, node *fath) {
    for (; x->f != fath;) {
      if (x->f->f == fath)
        x->rotate();
      else if (x->dir() == x->f->dir())
        x->f->rotate(), x->rotate();
      else
        x->rotate(), x->rotate();
    }
    push_up_root(x);
    if (fath == NULL) root = x;
  }
  void select(const int &pos, node *fath) {
    node *x = root;
    for (int sum = pos;;) {
      if (x->ch[0]->size == sum)
        break;
      else if (x->ch[0]->size < sum) {
        sum -= x->ch[0]->size + 1;
        x = x->ch[1];
      } else
        x = x->ch[0];
    }
    splay(x, fath);
  }
  node *build(const char *l, const char *r) {
    if (l == r)
      return nil;
    else {
      const char *mid = l + ((r - l) >> 1);
      return new_node(build(l, mid), build(mid + 1, r), *mid);
    }
  }
  void insert(int pos, node *x) {
    select(pos, NULL);
    select(pos + 1, root);
    root->ch[1]->ch[0] = x;
    x->f = root->ch[1];
    push_up_root(x);
  }
  void output(char *str, node *x) {
    if (x != nil) {
      output(str, x->ch[0]);
      str[x->ch[0]->size] = x->key;
      output(str + x->ch[0]->size + 1, x->ch[1]);
    }
  }
  void output(char *str, int l, int r) {
    select(l - 1, NULL);
    select(r, root);
    output(str, root->ch[1]->ch[0]);
  }
} Dstr;
int main() {
  scanf("%s", str + 1);
  int len;
  int n;
  scanf("%d%d", &len, &n);
  for (int i = 1; i <= n; i++) scanf("%d%d", &L[i], &R[i]);
  clen[n] = len;
  for (int i = n; i > 0; i--) {
    clen[i - 1] = R[i] < clen[i]
                      ? clen[i] - min(R[i] - L[i] + 1, clen[i] - R[i])
                      : clen[i];
  }
  str[0] = str[clen[0] + 1] = '$';
  Dstr.root = Dstr.build(str, str + clen[0] + 2);
  for (int i = 1; i <= n; i++) {
    if (clen[i - 1] < clen[i]) {
      int nl = clen[i] - clen[i - 1];
      int c = 0;
      for (int j = L[i] + 1; j <= R[i] && c < nl; j += 2) {
        Dstr.select(j, NULL);
        ns[c++] = Dstr.root->key;
      }
      for (int j = L[i]; j <= R[i] && c < nl; j += 2) {
        Dstr.select(j, NULL);
        ns[c++] = Dstr.root->key;
      }
      Dstr.insert(R[i], Dstr.build(ns, ns + c));
    }
  }
  Dstr.output(str, 1, len + 1);
  str[len] = '\0';
  puts(str);
  return 0;
}
