#define _CRT_SECURE_NO_WARNINGS
#include "bits/stdc++.h"
using namespace std;


typedef unsigned long long ULL;
typedef long long LL;
typedef pair<int, int> pr;
typedef pair<LL, LL> lpr;
typedef pair<double, double> dbpr;
typedef pair<long double, long double> ldpr;
typedef double db;
typedef long double ld;

#define dbgs(x) #x << " = " << x
#define dbgs2(x, y) dbgs(x) << ", " << dbgs(y)
#define dbgs3(x, y, z) dbgs2(x, y) << ", " << dbgs(z)
#define dbgs4(w, x, y, z) dbgs3(w, x, y) << ", " << dbgs(z)

#define mst(s, x) memset(s, x, sizeof(s))
#define fi first
#define se second
#define pb push_back
#define pf push_front
#define ppb pop_back
#define ppf pop_front
#define mp make_pair
#define all(x) x.begin(), x.end()
#define unq(x) x.erase(unique(x.begin(), x.end()), x.end())
#define fp(i, a, b) for (int i = (a), I = (b) + 1; i < I; ++i)
#define fd(i, a, b) for (int i = (a), I = (b)-1; i > I; --i)
#define ub upper_bound
#define lb lower_bound
#define bitcount __builtin_popcount
#define sqr(x) ((x)*(x))

#define go(u) for (int i = pre[u], v = e[i].v; i; i = e[i].next, v = e[i].v)
#define gow(u) for (LL i = pre[u], v = e[i].v, w = e[i].w; i; i = e[i].next, v = e[i].v, w = e[i].w)
#define EDGE(N,M) struct edge{int u,v,w,next;}e[M];int pre[N],edge_cnt=0;void addedge(int u,int v,int w=0){edge_cnt=edge_cnt+1,e[edge_cnt].u=u,e[edge_cnt].v=v,e[edge_cnt].w=w,e[edge_cnt].next=pre[u],pre[u]=edge_cnt;}
#define CLEAR_EDGE(N) {edge_cnt=0,memset(pre,0,sizeof(int)*(N+1));}

#define MC int _CASE;scanf("%d",&_CASE);fp(case_num,1,_CASE)

const int next_x[8] = {0, 1, -1, 0, 1, 1, -1, -1};
const int next_y[8] = {1, 0, 0, -1, 1, -1, -1, 1};
const int inf = 1e9+5;//7; 
const LL linf = 1e15;
const db  PI  = acos(-1.0);

const int MAXN  = 5000+5;
const int N     = 1e6+5;
const int M     = 1;
const ld eps    = 1e-8;

#define mid ((l+r)>>1)+
#define ls (cnt<<1)
#define rs (cnt<<1|1)

// #define ls ch[x][0]
// #define rs ch[x][1]

/*----------head----------*/

const LL MOD = 1e9+7;
int n,k,q;
LL a[MAXN],f[MAXN][MAXN],b[MAXN];
void mo(LL &x){x%=MOD,x+=MOD,x%=MOD;}
int main()
{
	scanf("%d%d%d",&n,&k,&q);
	fp(i,1,n)scanf("%lld",&a[i]);
	fp(i,1,n)f[i][0]=1;
	fp(j,1,k)fp(i,1,n)
	{
		f[i][j]=0;
		if(i>=2)f[i][j]+=f[i-1][j-1];
		if(i< n)f[i][j]+=f[i+1][j-1];
		f[i][j]%=MOD;
	}

	LL ans=0;
	fp(i,1,n)fp(j,0,k)b[i]+=f[i][j]*f[i][k-j]%MOD,b[i]%=MOD;
	fp(i,1,n)ans=(ans+a[i]*b[i]%MOD)%MOD;
	while(q--)
	{
		int i,x;scanf("%d%d",&i,&x);
		ans-=(a[i]*b[i])%MOD,mo(ans);
		a[i]=x;
		ans+=(a[i]*b[i])%MOD,mo(ans);
		printf("%lld\n",ans);
	}
	return 0;
}


// 函数不返回值可能会 RE
// 少码大数据结构，想想复杂度更优的做法
// 小数 二分/三分 注意break条件
// 浮点运算 sqrt(a^2-b^2) 可用 sqrt(a+b)*sqrt(a-b) 代替，避免精度问题
// long double -> %Lf 别用C11 (C14/16)
// 控制位数 cout << setprecision(10) << ans;
// reverse vector 注意判空 不然会re
// 分块注意维护块上标记 来更新块内数组a[]
// vector+lower_bound常数 < map/set/(unordered_map)
// map.find不会创建新元素 map[]会 注意空间
// 别对指针用memset
// 用位运算表示2^n注意加LL 1LL<<20
// 注意递归爆栈
// 注意边界  
// 注意memset 多组会T
