#include <bits/stdc++.h>
#define fast ios::sync_with_stdio(0), cin.tie(nullptr)
#define all(v) (v).begin(), (v).end()
#define compress(v) sort(all(v)), (v).erase(unique(all(v)), (v).end());
#define sq(n) ((n)*(n))
using namespace std;
using ll = long long;
using ld = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using tii = tuple<int, int, int>;
using tll = tuple<ll, ll, ll>;
const ll S = 100000 + 50, MAX = 0x3f3f3f3f, MOD = 1e9+7;;
struct Mat{
ll A[3][3];
Mat operator*(const Mat& x){
Mat ret;
memset(ret.A, 0, sizeof ret.A);
for (int i = 0; i < 3; i++){
for (int j = 0; j < 3; j++){
for (int k = 0; k < 3; k++)
ret.A[i][j] = (ret.A[i][j] + A[i][k]*x.A[k][j]) % MOD;
}
}
return ret;
}
} seg[S << 2];
Mat pow(const Mat& b, ll e){
if (!e){
Mat ret;
memset(ret.A, 0, sizeof ret.A);
ret.A[0][0] = ret.A[1][1] = ret.A[2][2] = 1;
return ret;
}
Mat ret = pow(b, e/2);
ret = ret * ret;
if (e % 2) ret = ret * b;
return ret;
}
vector<pll> qry;
vector<ll> comp;
vector<Mat> pows;
Mat tmp = {{{0, 1, 0}, {1, 1, 0}, {0, 0, 1}}};
void init(int now, int l, int r){
if (l == r){
auto A = seg[now].A;
A[0][1] = A[1][0] = A[1][1] = A[2][2] = 1;
return;
}
int mid = l+r >> 1;
init(now*2,l,mid);
init(now*2+1,mid+1,r);
seg[now] = seg[now*2] * pows[mid] * seg[now*2+1];
}
void update(int now, int l, int r, int idx, ll v){
if (idx < l or r < idx) return;
if (l == r){
auto A = seg[now].A;
memset(A, 0, sizeof seg[now].A);
A[0][1] = A[2][2] = 1;
A[2][0] = A[2][1] = v;
return;
}
int mid = l+r >> 1;
update(now*2, l, mid, idx, v);
update(now*2+1, mid+1, r, idx, v);
seg[now] = seg[now*2] * pows[mid] * seg[now*2+1];
}
int main() {
fast;
#ifdef ONLINE_JUDGE
#define endl '\n'
#else
freopen("input.txt", "r", stdin);
#endif
ll N, Q;
cin >> N >> Q;
qry.resize(Q);
for (auto&[a,b]:qry) {
cin >> a >> b;
b %= MOD;
comp.push_back(a);
}
comp.push_back(-1);
compress(comp);
pows.resize(comp.size());
pows[0] = pow(tmp, comp[1]-1), pows.back() = pow(tmp, N - comp.back());
for (int i = 1; i+1 < comp.size(); i++)
pows[i] = pow(tmp, comp[i+1] - comp[i] - 1);
init(1,1,comp.size()-1);
for (auto&[a,b]:qry){
update(1, 1, comp.size()-1, lower_bound(all(comp), a) - comp.begin(), b);
Mat now = pows[0] * seg[1] * pows.back();
cout << (now.A[1][0] + now.A[2][0]) % MOD << '\n';
}
}