#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
const int N = 3 * 1e6 + 10;
const int M = 3 * 1e4 + 10;
char mde[N];
int n;
int m;
int k;
struct bcj {
  int fa[N];
  char val[N];
  inline void ih() {
    for (int i = 1; i <= k; i++) fa[i] = i;
  }
  inline int f(const int& x) { return fa[x] = (x == fa[x]) ? x : f(fa[x]); }
  inline void u(const int& x, const int& y) { fa[f(x)] = f(y); }
  inline void st(const int& x, char c) { val[f(x)] = c; }
  inline void prit(const int& x) { printf("%c", val[f(x)]); }
} s;
struct data {
  int l;
  int r;
} a[2][M];
int tp;
int tot;
int p;
int lf[M];
int rt[M];
struct iter {
  data* p;
  int pos;
  iter& operator++() {
    if (p->r == pos)
      ++p, pos = p->l;
    else
      ++pos;
    return *this;
  }
};
int main() {
  scanf("%s", mde + 1);
  scanf("%d", &k);
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d%d", &lf[i], &rt[i]);
  s.ih();
  tot = k;
  p = 0;
  a[p][++tp] = (data){1, k};
  a[p][tp + 1] = (data){0x3f3f3f3f, 0};
  for (int t = n; t >= 1; t--) {
    if (rt[t] >= tot) continue;
    int len = rt[t] - lf[t] + 1;
    int dl = rt[t] + 1;
    int dr = min(rt[t] + len, tot);
    int mid = rt[t] + (len / 2) + 1;
    iter it1, it2, it3;
    int cnt = 0;
    it1.pos = 0x3f3f3f3f;
    it2.pos = 0x3f3f3f3f;
    it3.pos = 0x3f3f3f3f;
    cnt = 0;
    for (int i = 1; i <= tp; i++) {
      cnt += a[p][i].r - a[p][i].l + 1;
      if (cnt >= lf[t]) {
        it1 = (iter){&a[p][i], a[p][i].r - cnt + lf[t]};
        break;
      }
    }
    cnt = 0;
    for (int i = 1; i <= tp; i++) {
      cnt += a[p][i].r - a[p][i].l + 1;
      if (cnt >= dl) {
        it2 = (iter){&a[p][i], a[p][i].r - cnt + dl};
        break;
      }
    }
    cnt = 0;
    for (int i = 1; i <= tp; i++) {
      cnt += a[p][i].r - a[p][i].l + 1;
      if (cnt >= mid) {
        it3 = (iter){&a[p][i], a[p][i].r - cnt + mid};
        break;
      }
    }
    for (int i = 1;
         i <= len && (it3.pos != 0x3f3f3f3f || it2.pos != 0x3f3f3f3f);
         i++, ++it1)
      if (i & 1) {
        if (it3.pos != 0x3f3f3f3f) s.u(it1.pos, it3.pos), ++it3;
      } else if (it2.pos != 0x3f3f3f3f)
        s.u(it1.pos, it2.pos), ++it2;
    int lim = tp;
    tp = 0;
    cnt = 0;
    for (int i = 1; i <= lim; i++) {
      int pp = cnt;
      cnt += a[p][i].r - a[p][i].l + 1;
      if (cnt < dl || pp >= dr) {
        a[p ^ 1][++tp] = a[p][i];
        continue;
      }
      if (pp < rt[t])
        a[p ^ 1][++tp] = (data){a[p][i].l, a[p][i].l + rt[t] - pp - 1};
      if (cnt > dr)
        a[p ^ 1][++tp] = (data){a[p][i].r - cnt + dr + 1, a[p][i].r};
    }
    tot -= (dr - dl + 1);
    p ^= 1;
    a[p][tp + 1] = (data){0x3f3f3f3f, 0};
  }
  iter it = (iter){&a[p][1], a[p][1].l};
  for (int i = 1; i <= tot; i++) {
    s.st(it.pos, mde[i]);
    ++it;
  }
  for (int i = 1; i <= k; i++) s.prit(i);
  return 0;
}
