You've got an array consisting of n integers: a[1], a[2], ..., a[n]. Moreover, there are m queries, each query can be described by three integers li, ri, ki. Query li, ri, ki means that we should add  to each element a[j], where li ≤ j ≤ ri.

Record  means the binomial coefficient, or the number of combinations from yelements into groups of x elements.

You need to fulfil consecutively all queries and then print the final array.

Input

The first line contains integers nm (1 ≤ n, m ≤ 105).

The second line contains n integers a[1], a[2], ..., a[n] (0 ≤ ai ≤ 109) — the initial array.

Next m lines contain queries in the format li, ri, ki — to all elements of the segment li... ri add number  (1 ≤ li ≤ ri ≤ n; 0 ≤ k ≤ 100).

Output

Print n integers: the i-th number is the value of element a[i] after all the queries. As the values can be rather large, print them modulo 1000000007 (109 + 7).

Examples

Input
5 1
0 0 0 0 0
1 5 0
Output
1 1 1 1 1
Input
10 2
1 2 3 4 5 0 0 0 0 0
1 6 1
6 10 2
Output
2 4 6 8 10 7 3 6 10 15

题意:给出n个数,m次操作
每次操作给出li,ri,ki
将li-ri的范围里的第j个数加上  题解:考虑到上面的ki是在每个操作里是不会变的
考虑在杨辉三角中找规律

k=i是k=i-1的前缀和
然后可以考虑差分
在高维进行好差分后一维一维的降下来
注意差分的时候要每一层都差分 代码如下:
#include<map>
#include<cmath>
#include<queue>
#include<cstdio>
#include<string>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#define mod 1000000007
using namespace std; long long fac[],inv[],n,m,a[][],sum[][]; long long kasumi(long long a,long long b)
{
long long ans=1ll;
while(b)
{
if(b&)
{
ans=ans*a%mod;
}
a=a*a%mod;
b>>=;
}
return ans;
} long long c(long long a,long long b)
{
return fac[a]*inv[b]%mod*inv[a-b]%mod;
} int main()
{
fac[]=,inv[]=;
for(int i=; i<=; i++)
{
fac[i]=fac[i-]*i*1ll%mod;
}
inv[]=kasumi(fac[],mod-);
for(int i=; i>=; i--)
{
inv[i]=inv[i+]*(i+)*1ll%mod;
}
scanf("%lld%lld",&n,&m);
for(int i=; i<n; i++)
{
scanf("%lld",&a[][i]);
}
long long l,r,k;
while(m--)
{
scanf("%lld%lld%lld",&l,&r,&k);
l--,k++;
a[k][l]++;
for(int i=; i<=k; i++)
{
a[i][r]-=c(k-i+r-l-,k-i);
a[i][r]=(a[i][r]+mod)%mod;
}
}
for(int k=; k>=; k--)
{
for(int i=;i<n;i++)
{
a[k][i]+=sum[k+][i+];
a[k][i]%=mod;
}
for(int i=;i<n;i++)
{
sum[k][i+]+=sum[k][i]+a[k][i];
sum[k][i+]%=mod;
}
}
for(int i=;i<n;i++)
{
printf("%lld ",a[][i]%mod);
}
}

 
 

最新文章

  1. rewrite规则中参数多于9个的处理方式 apache nginx
  2. 在windows上安装ASP.NET 5(译文)
  3. C# WM_NCMOUSELEAVE 消息触发
  4. hibernate.properties与hibernate.cfg.xml 区别
  5. UVaLive 7363 A Rational Sequence (二叉树)
  6. skip-grant-tables的作用
  7. C++拾遗(九)类与动态内存分配(1)
  8. Request和Response详解
  9. uva Matrix Decompressing (行列模型)
  10. Redis 安装总结记录 附送redis-desktop-manager工具
  11. package.json文件配置信息
  12. LiveCharts文档-3开始-3类型和设置
  13. JavaScript 知识
  14. Linux rhel7 下MySQL5.7.18详细安装文档
  15. zookeeper应用 - 配置服务
  16. fio是如何运行的?
  17. 序列内第k小查询(线段树)
  18. MySQL-开发规范升级版
  19. linux安装jdk1.6
  20. beego——多种格式的数据输出

热门文章

  1. cookies,sessionStorage,localStorage的区别
  2. OD 实验(十) - 对一个 VB 程序的逆向
  3. Oracle播放多条 INSERT ALL
  4. PEM文件和private.key文件生成IIS服务器所需的pfx文件(配置SSL用)
  5. C#利用QrCode.Net生成二维码(Qr码
  6. linux查看电脑硬件配置
  7. ie8、9 post 跨域
  8. Unity几个有用的游戏运动特效
  9. ios规格证明
  10. ajax获取json数据为undefined--原因解析