#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;   }   