#include <bits/stdc++.h>
using namespace std;
typedef struct node {
  int leftEnd;
  int rightEnd;
  bool valid;
  int prefixLE;
  int suffixLE;
  long long data[4][4];
  node *leftChild;
  node *rightChild;
} node;
int a[100001], T[100001], cnt[100001], pLE[100001], sLE[100001], inds[100001];
vector<vector<int> > prefixLE(100001), suffixLE(100001);
node *root[100001];
node *CreateNode(int leftEnd, int rightEnd, int rootNo) {
  node *temp = new node;
  temp->leftEnd = leftEnd;
  temp->rightEnd = rightEnd;
  for (int i = 0; i < 4; i++)
    for (int j = 0; j < 4; j++) temp->data[i][j] = 0;
  temp->valid = 0;
  if (leftEnd == rightEnd) {
    temp->valid = 1;
    temp->prefixLE = prefixLE[rootNo][leftEnd];
    temp->suffixLE = suffixLE[rootNo][leftEnd];
    for (int i = 0; i < 4; i++) temp->data[i][i] = 1;
    temp->data[0][1] = temp->prefixLE;
    temp->data[2][3] = temp->suffixLE;
    temp->data[1][2] = 1;
  }
  return temp;
}
void MergeData(long long a[4][4], long long b[4][4], long long c[4][4]) {
  for (int i = 0; i < 4; i++)
    for (int j = i; j < 4; j++) {
      c[i][j] = 0;
      for (int k = i; k < 4; k++)
        c[i][j] = (c[i][j] + a[i][k] * b[k][j]) % 1000000007;
    }
}
void PrintData(long long a[4][4]) {
  for (int i = 0; i < 4; i++) {
    for (int j = 0; j < 4; j++) printf("%lld ", a[i][j]);
    printf("\n");
  }
  printf("\n");
}
node *BuildSegmentTree(int leftEnd, int rightEnd, int rootNo) {
  node *temp = CreateNode(leftEnd, rightEnd, rootNo);
  if (leftEnd != rightEnd) {
    int mid = (leftEnd + rightEnd) / 2;
    temp->leftChild = BuildSegmentTree(leftEnd, mid, rootNo);
    temp->rightChild = BuildSegmentTree(mid + 1, rightEnd, rootNo);
    MergeData(temp->leftChild->data, temp->rightChild->data, temp->data);
  } else
    temp->leftChild = temp->rightChild = NULL;
  return temp;
}
void UpdateLeafNode(node *leafNode) {
  leafNode->valid = 1 ^ leafNode->valid;
  leafNode->data[0][1] = leafNode->valid * leafNode->prefixLE;
  leafNode->data[2][3] = leafNode->valid * leafNode->suffixLE;
  leafNode->data[1][2] = leafNode->valid;
}
void UpdateNode(node *currentNode, int i) {
  if (i < currentNode->leftEnd || currentNode->rightEnd < i)
    return;
  else {
    if (i == currentNode->leftEnd && currentNode->rightEnd == i)
      UpdateLeafNode(currentNode);
    else {
      UpdateNode(currentNode->leftChild, i);
      UpdateNode(currentNode->rightChild, i);
      MergeData(currentNode->leftChild->data, currentNode->rightChild->data,
                currentNode->data);
    }
  }
}
void BITUpdate(int i, int n) {
  for (; i <= n; i += (i & -i)) T[i]++;
}
int BITQuery(int i) {
  int ans = 0;
  for (; i > 0; i -= (i & -i)) ans += T[i];
  return ans;
}
int CoordinateCompress(int n) {
  int m;
  vector<int> v;
  for (int i = 1; i <= n; i++) v.push_back(a[i]);
  sort(v.begin(), v.end());
  v.erase(unique(v.begin(), v.end()), v.end());
  for (int i = 1; i <= n; i++)
    a[i] = lower_bound(v.begin(), v.end(), a[i]) - v.begin() + 1;
  m = v.size();
  return m;
}
void PrintArrays(int *a, int n, string s) {
  cout << s << ": \n";
  for (int i = 1; i <= n; i++) printf("%d ", a[i]);
  printf("\n\n");
}
int Initialisation(int n) {
  int m = CoordinateCompress(n);
  for (int i = 1; i <= n; i++) {
    pLE[i] = BITQuery(a[i]);
    BITUpdate(a[i], m);
  }
  for (int i = 1; i <= m; i++) T[i] = 0;
  for (int i = n; i > 0; i--) {
    sLE[i] = BITQuery(a[i]);
    BITUpdate(a[i], m);
  }
  for (int i = 1; i <= m; i++) {
    prefixLE[i].push_back(0);
    suffixLE[i].push_back(0);
  }
  for (int i = 1; i <= n; i++) {
    int j = a[i];
    cnt[j]++;
    inds[i] = cnt[j];
    prefixLE[j].push_back(pLE[i]);
    suffixLE[j].push_back(sLE[i]);
  }
  for (int i = 1; i <= m; i++) {
    int treeSize = cnt[i];
    root[i] = BuildSegmentTree(1, treeSize, i);
  }
  return m;
}
long long Query(int k) { return root[k]->data[0][3]; }
long long Update(int i) {
  int k = a[i];
  long long ansChange = -Query(k);
  UpdateNode(root[k], inds[i]);
  ansChange = (Query(k) + ansChange + 1000000007) % 1000000007;
  return ansChange;
}
int main() {
  int n, q, totalRoots;
  long long ans = 0;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  totalRoots = Initialisation(n);
  for (int i = 1; i <= totalRoots; i++) ans = (ans + Query(i)) % 1000000007;
  scanf("%d", &q);
  while (q--) {
    int t, x;
    scanf("%d%d", &t, &x);
    ans = (ans + Update(x)) % 1000000007;
    printf("%lld\n", ans);
  }
  return 0;
}
