Problem: Inna is fed up with jokes about female logic. So she started using binary logic instead.

Inna has an array of n elements a1[1], a1[2], ..., a1[n]. Girl likes to train in her binary logic, so she does an exercise consisting of n stages: on the first stage Inna writes out all numbers from array a1, on the i-th (i ≥ 2) stage girl writes all elements of array ai, which consists of n - i + 1 integers; the k-th integer of array ai is defined as follows: ai[k] = ai - 1[k] AND ai - 1[k + 1]. Here AND is bit-wise binary logical operation.

Dima decided to check Inna's skill. He asks Inna to change array, perform the exercise and say the sum of all <image> elements she wrote out during the current exercise.

Help Inna to answer the questions!

Input

The first line contains two integers n and m (1 ≤ n, m ≤ 105) — size of array a1 and number of Dima's questions. Next line contains n integers a1[1], a1[2], ..., a1[n] (0 ≤ ai ≤ 105) — initial array elements.

Each of next m lines contains two integers — Dima's question description. Each question consists of two integers pi, vi (1 ≤ pi ≤ n; 0 ≤ vi ≤ 105). For this question Inna should make a1[pi] equals vi, and then perform the exercise. Please, note that changes are saved from question to question.

Output

For each question print Inna's answer on a single line.

Examples

Input

3 4
1 1 1
1 1
2 2
3 2
1 2


Output

6
4
7
12

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
long long ans;
int n, Q, p = 1, x, base[18], t[18][100001];
set<int> Set[18];
inline void in(int &x) {
  char c;
  while (!isdigit(c = getchar()))
    ;
  for (x = 0; isdigit(c); c = getchar()) x = x * 10 - 48 + c;
}
int main() {
  in(n);
  in(Q);
  for (int j = 0; j < 18; ++j, p <<= 1)
    Set[j].insert(0), Set[j].insert(n + 1), base[j] = p;
  for (int i = 1; i <= n; ++i) {
    in(x);
    for (int j = 0; j < 18; ++j, x >>= 1)
      if (x & 1)
        t[j][i] = 1;
      else
        Set[j].insert(i);
  }
  for (int i = 0; i < 18; ++i) {
    int L = 0;
    for (int j = 1; j <= n; ++j)
      if (t[i][j])
        ++L;
      else
        ans += ((L + 1ll) * L >> 1) * base[i], L = 0;
    ans += ((L + 1ll) * L >> 1) * base[i];
  }
  while (Q--) {
    in(p);
    in(x);
    for (int j = 0; j < 18; ++j, x >>= 1)
      if (x & 1)
        if (!t[j][p]) {
          set<int>::iterator k = Set[j].lower_bound(p), h = k--;
          ++h;
          t[j][p] = 1;
          ans += (((*h - *k - 1ll) * (*h - *k) >> 1) -
                  ((p - *k - 1ll) * (p - *k) >> 1) -
                  ((*h - p - 1ll) * (*h - p) >> 1)) *
                 base[j];
          Set[j].erase(--h);
        } else
          ;
      else if (t[j][p]) {
        set<int>::iterator k = Set[j].lower_bound(p), h = k--;
        t[j][p] = 0;
        ans -= (((*h - *k - 1ll) * (*h - *k) >> 1) -
                ((p - *k - 1ll) * (p - *k) >> 1) -
                ((*h - p - 1ll) * (*h - p) >> 1)) *
               base[j];
        Set[j].insert(p);
      }
    printf("%I64d\n", ans);
  }
}