codeforces316E3
Summer Homework
By the age of three Smart Beaver mastered all arithmetic operations and got this summer homework from the amazed teacher:
You are given a sequence of integers a1, a2, ..., an. Your task is to perform on it mconsecutive operations of the following type:
- For given numbers xi and vi assign value vi to element axi.
- For given numbers li and ri you've got to calculate sum
, where f0 = f1 = 1 and at i ≥ 2: fi = fi - 1 + fi - 2.
- For a group of three numbers li ri di you should increase value ax by di for all x (li ≤ x ≤ ri).
Smart Beaver planned a tour around great Canadian lakes, so he asked you to help him solve the given problem.
Input
The first line contains two integers n and m (1 ≤ n, m ≤ 2·105) — the number of integers in the sequence and the number of operations, correspondingly. The second line contains n integers a1, a2, ..., an (0 ≤ ai ≤ 105). Then follow m lines, each describes an operation. Each line starts with an integer ti (1 ≤ ti ≤ 3) — the operation type:
- if ti = 1, then next follow two integers xi vi (1 ≤ xi ≤ n, 0 ≤ vi ≤ 105);
- if ti = 2, then next follow two integers li ri (1 ≤ li ≤ ri ≤ n);
- if ti = 3, then next follow three integers li ri di (1 ≤ li ≤ ri ≤ n, 0 ≤ di ≤ 105).
The input limits for scoring 30 points are (subproblem E1):
- It is guaranteed that n does not exceed 100, m does not exceed 10000 and there will be no queries of the 3-rd type.
The input limits for scoring 70 points are (subproblems E1+E2):
- It is guaranteed that there will be queries of the 1-st and 2-nd type only.
The input limits for scoring 100 points are (subproblems E1+E2+E3):
- No extra limitations.
Output
For each query print the calculated sum modulo 1000000000 (109).
Examples
5 5
1 3 1 2 4
2 1 4
2 1 5
2 2 4
1 3 10
2 1 5
12
32
8
50
5 4
1 3 1 2 4
3 1 4 1
2 2 4
1 2 10
2 1 5
12
45
sol:对于斐波那契数列,是有矩阵的递推公式的,搬一个讲的很好的blog
自己手撸一下,发现法2转移其实很好理解
如这样一个数列
1,2,3,4
斐波那契数列是1 1 2 3 5
S[0](1~2)是1*f[0]+2*f[1] S[1](1~2)是1*f[1]+2*f[2]
S[0](3~4)是3*f[0]+4*f[1] S[1](1~2)是3*f[1]+4*f[2]
转移S[0](1~4)是1*f[0]+2*f[1]+3*(f[0]*f[0]+f[1]*f[1])+4*(f[1]*f[0]+f[2]*f[1])
假如把这些看成矩阵乘法
这个例子太low了看个大一点的
数列1,2,3,4,5,6,7,8
S[0](1,8)直接看后面的
5*(f[0]*f[2]+f[1]*f[3])+6*(f[1]*f[2]+f[2]*f[3])+7*(f[2]*f[2]+f[3]*f[3])+8*(f[3]*f[2]+f[4]*f[3]) 然后机智的发现f[0]=f[1]=1,所以f[0]*f[2]+f[1]*f[3]=f[4] 容易知道f[0]*矩阵k=f[1] f[1]*矩阵k=f[2] 所以f[1]*f[2]+f[2]*f[3]就是f[4]*矩阵k=f[5] 容易发现f[0]*f[2]+f[1]*f[3]=f[4] f[1]*f[2]+f[2]*f[3]=f[5] 这样就做完了qaq
k=1 1
1 0
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll read()
{
ll s=; bool f=; char ch=' ';
while(!isdigit(ch)) {f|=(ch=='-'); ch=getchar();}
while(isdigit(ch)) {s=(s<<)+(s<<)+(ch^); ch=getchar();}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<) {putchar('-'); x=-x;}
if(x<) {putchar(x+''); return;}
write(x/); putchar((x%)+'');
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=;
const ll Mod=;
int n,m;
ll a[N],f[N],fs[N];
inline int fei(int x){if(x<)return ;else return f[x];}
struct Node
{
ll le,S[],lazy;
}T[N<<];
#define c1 (x<<1)
#define c2 (x<<1|1)
inline ll Ad(ll x,ll y) {x+=y; x-=(x>=Mod)?Mod:; x+=(x<)?Mod:; return x;}
inline ll Ad(ll x,ll y,ll z){return Ad(Ad(x,y),z);}
inline ll Mul(ll x,ll y) {return 1ll*x*y%Mod;}
inline Node Merg(Node a,Node b)
{
Node ans;
ans.le=a.le+b.le; ans.lazy=;
ans.S[]=Ad(a.S[],Mul(b.S[],fei(a.le-)),Mul(b.S[],fei(a.le-)));
ans.S[]=Ad(a.S[],Mul(b.S[],fei(a.le-)),Mul(b.S[],fei(a.le)));
return ans;
}
inline void F5(Node &a,ll oo)
{
a.S[]=Ad(a.S[],Mul(oo,fs[a.le-]));
a.S[]=Ad(a.S[],Ad(Mul(oo,fs[a.le]),-oo));
}
inline void PushDown(int x)
{
if(!T[x].lazy) return;
T[c1].lazy=Ad(T[c1].lazy,T[x].lazy); F5(T[c1],T[x].lazy);
T[c2].lazy=Ad(T[c2].lazy,T[x].lazy); F5(T[c2],T[x].lazy);
T[x].lazy=;
}
inline void Build(int x,int l,int r)
{
T[x].le=r-l+; T[x].lazy=;
if(l==r)
{
T[x].S[]=T[x].S[]=a[l]; return;
}
int mid=(l+r)>>;
Build(c1,l,mid); Build(c2,mid+,r);
T[x]=Merg(T[c1],T[c2]);
}
inline void Chag(int x,int l,int r,int Pos,ll Val)
{
if(l==r)
{
T[x].S[]=T[x].S[]=Val; return;
}
PushDown(x);
int mid=(l+r)>>;
if(Pos<=mid) Chag(c1,l,mid,Pos,Val);
else Chag(c2,mid+,r,Pos,Val);
T[x]=Merg(T[c1],T[c2]);
}
inline Node Que(int x,int l,int r,int ql,int qr)
{
// cout<<l<<' '<<r<<' '<<ql<<' '<<qr<<" "<<T[x].S[0]<<endl;
if(ql==l&&qr==r) return T[x];
PushDown(x);
int mid=(l+r)>>;
if(qr<=mid) return Que(c1,l,mid,ql,qr);
else if(ql>mid) return Que(c2,mid+,r,ql,qr);
else return Merg(Que(c1,l,mid,ql,mid),Que(c2,mid+,r,mid+,qr));
T[x]=Merg(T[c1],T[c2]);
}
inline void Updata(int x,int l,int r,int ql,int qr,ll Val)
{
if(ql==l&&qr==r)
{
T[x].lazy=Ad(T[x].lazy,Val); F5(T[x],Val); return;
}
PushDown(x);
int mid=(l+r)>>;
if(qr<=mid) Updata(c1,l,mid,ql,qr,Val);
else if(ql>mid) Updata(c2,mid+,r,ql,qr,Val);
else Updata(c1,l,mid,ql,mid,Val),Updata(c2,mid+,r,mid+,qr,Val);
T[x]=Merg(T[c1],T[c2]);
}
int main()
{
int i;
R(n); R(m);
for(i=;i<=n;i++) R(a[i]);
f[]=f[]=; for(i=;i<=n;i++) f[i]=Ad(f[i-],f[i-]);
fs[]=; for(i=;i<=n;i++) fs[i]=Ad(fs[i-],f[i]);
Build(,,n);
// cout<<"!!!!"<<Que(1,1,n,4,4).S[0]<<endl;
// return 0;
while(m--)
{
int opt; ll x,y,z; R(opt); R(x); R(y);
if(opt==)
{
Chag(,,n,x,y);
}
else if(opt==)
{
if(x>y) swap(x,y);
Node ans=Que(,,n,x,y); Wl(ans.S[]);
}
else if(opt==)
{
R(z); Updata(,,n,x,y,z);
}
}
return ;
}
/*
Input
5 5
1 3 1 2 4
2 1 4
2 1 5
2 2 4
1 3 10
2 1 5
Output
12
32
8
50 Input
5 4
1 3 1 2 4
3 1 4 1
2 2 4
1 2 10
2 1 5
Output
12
45
*/
codeforces316E3的更多相关文章
- codeforces316E3 Summer Homework(线段树,斐波那契数列)
题目大意 给定一个n个数的数列,m个操作,有三种操作: \(1\ x\ v\) 将\(a_x\)的值修改成v $2\ l\ r\ $ 求 \(\sum_{i=l}^r x_i*f_{i-l}\) 其中 ...
随机推荐
- Docker 常用命令和Dockerfile
Docker 简介 官方的解释为:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现 ...
- java学习要想精炼掌握应运的必备知识(博文来源于网络)
一: 编程基础 不管是C还是C++,不管是Java还是PHP,想成为一名合格的程序员,基本的数据结构和算法基础还是要有的.下面几篇文章从思想到实现,为你梳理出常用的数据结构和经典算法. 1-1 常用数 ...
- Python 异常处理与反射机制
Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...
- 怎样在Chrome浏览器上安装 Vue Devtools 扩展程序
第一步: 前往 GitHub 下载 Vue Devtools 项目文件 https://github.com/vuejs/vue-devtools 注意: 1. 将分支切换为 master 2. 下载 ...
- javascript常用内置对象——Array对象
Array对象: 创建 Array 对象的语法: new Array(); new Array(元素个数); new Array(element0, element1, ..., elementn); ...
- dedecms Fatal error: Out of memory
max_execution_time = 300 php执行持续最长时间 比如:网站全站更新max_input_time = 30 php传送数据最长时间 比如:上传大文件memory_l ...
- 【异常】诡异的mysql错误,Pagehelper插件混乱导致吗
1 详细的异常信息 Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in ...
- troubshooting-sqoop 导出 TiDB表数据报com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
2019-11-22 17:15:27,705 FATAL [IPC Server handler 13 on 44844] org.apache.hadoop.mapred.TaskAttemptL ...
- mysql 5.6.38 数据库编译安装
一.系统环境: # cat /etc/redhat-release CentOS release 6.9 (Final) 二.mysql 编译安装: 1.安装依赖包: yum install -y n ...
- SQLSERVER EXISTS IN 优化
数据量: 首先我们看看待优化的SQL: 简单的分析下来发现: EXISTS 这部分执行比较慢,我们来看一下, 这种写法比较便于理解,但是执行起来却很慢.既然这里慢,我们就要优化这部分. 首先我是想把拼 ...

