Problem Description
Recently, Doge got a funny birthday present from his new friend, Protein Tiger from St. Beeze College. No, not cactuses. It's a mysterious blackbox.



After some research, Doge found that the box is maintaining a sequence an of n numbers internally, initially all numbers are zero, and there are THREE "operations":



1.Add d to the k-th number of the sequence.

2.Query the sum of ai where l ≤ i ≤ r.

3.Change ai to the nearest Fibonacci number, where l ≤ i ≤ r.

4.Play sound "Chee-rio!", a bit useless.



Let F0 = 1,F1 = 1,Fibonacci number Fn is defined as Fn = Fn - 1 + Fn - 2 for n ≥ 2.



Nearest Fibonacci number of number x means the smallest Fn where |Fn - x| is also smallest.



Doge doesn't believe the machine could respond each request in less than 10ms. Help Doge figure out the reason.
 
Input
Input contains several test cases, please process till EOF.

For each test case, there will be one line containing two integers n, m.

Next m lines, each line indicates a query:



1 k d - "add"

2 l r - "query sum"

3 l r - "change to nearest Fibonacci"



1 ≤ n ≤ 100000, 1 ≤ m ≤ 100000, |d| < 231, all queries will be valid.
 
Output
For each Type 2 ("query sum") operation, output one line containing an integer represent the answer of this query.
 
Sample Input
1 1
2 1 1
5 4
1 1 7
1 3 17
3 2 4
2 1 5
 
Sample Output
0
22
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define ll __int64
#define maxn 100005
#define ls l,mid,2*i
#define rs mid+1,r,2*i+1
#define lson 2*i
#define rson 2*i+1
struct node
{
int l,r;
ll e,f;//e为该区间的和,f为其近期的斐波那契数
int flag,len;//flag,标记这个区间内是否斐波那契数,len为长度
} a[maxn<<2];
int n,m;
ll f[90] = {1,1}; ll pabs(ll a)
{
return a<0?-a:a;
} void PushDown(int i,int m)
{
if(a[i].flag)
{
a[lson].flag = a[rson].flag = a[i].flag;
a[lson].len = a[i].flag*(m-m>>1);
a[rson].len = a[i].flag*(m>>1);
a[lson].e = a[lson].f;
a[rson].e = a[rson].f;
a[i].flag = 0;
}
} void PushUp(int i)
{
a[i].e = a[lson].e+a[rson].e;
a[i].f = a[lson].f+a[rson].f;
} void init(int l,int r,int i)
{
a[i].flag = a[i].len = 0;
a[i].l = l;
a[i].r = r;
a[i].e = 0;
if(l == r)
{
a[i].f = 1;
return;
}
int mid = (l+r)>>1;
init(ls);
init(rs);
PushUp(i);
} void add(int pos,int m,int l,int r,int i)
{
if(pos<l || pos>r) return ;
if(l == r)
{
if(a[i].flag)
{
a[i].e = m+a[i].f;
a[i].flag = 0;
a[i].len = 0;
}
else a[i].e+=m;
int p = lower_bound(f,f+80,a[i].e)-f;
if(!p)
a[i].f = 1;
else if(pabs(a[i].e-f[p])<pabs(a[i].e-f[p-1]))
a[i].f = f[p];
else
a[i].f = f[p-1];
return ;
}
PushDown(i,r-l+1);
int mid = (l+r)>>1;
if(pos<=mid) add(pos,m,ls);
else add(pos,m,rs);
PushUp(i);
} ll query(int L,int R,int l,int r,int i)
{
if(R<l || L>r) return 0;
else if(L<=l && R>=r) return a[i].e;
PushDown(i,r-l+1);
ll ans = 0;
int mid = (l+r)>>1;
if(L<=mid)
ans += query(L,R,ls);
if(R>mid)
ans += query(L,R,rs);
return ans;
} void change(int L,int R,int l,int r,int i)
{
if(R<l || L>r) return ;
if(L<=l && R>=r)
{
a[i].e = a[i].f;
a[i].flag = 1;
a[i].len = r-l+1;
return ;
}
PushDown(i,r-l+1);
int mid = (l+r)>>1;
if(L<=mid)
change(L,R,ls);
if(R>mid)
change(L,R,rs);
PushUp(i);
} int main()
{
int i,j,x,k,d,l,r;
for(i = 2; i<80; i++)
f[i] = f[i-1]+f[i-2];
while(~scanf("%d%d",&n,&m))
{
init(1,n,1);
while(m--)
{
scanf("%d",&x);
if(x == 1)
{
scanf("%d%d",&k,&d);
add(k,d,1,n,1);
}
else
{
scanf("%d%d",&l,&r);
if(x == 2)
printf("%I64d\n",query(l,r,1,n,1));
else
change(l,r,1,n,1);
}
}
} return 0;
}


HDU4893:Wow! Such Sequence!(段树lazy)的更多相关文章

  1. 2014多校3 Wow! Such Sequence!段树

    主题链接:http://acm.hdu.edu.cn/showproblem.php? pid=4893 这个问题还真是纠结啊--好久不写线段树的题了.由于这几天学伸展树.然后认为线段树小case了. ...

  2. Wow! Such Sequence!(线段树4893)

    Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...

  3. hdu 4893 Wow! Such Sequence!(线段树)

    题目链接:hdu 4983 Wow! Such Sequence! 题目大意:就是三种操作 1 k d, 改动k的为值添加d 2 l r, 查询l到r的区间和 3 l r. 间l到r区间上的所以数变成 ...

  4. hdu4893 Wow! Such Sequence!

    线段树结点上保存一个一般的sum值,再同一时候保存一个fbsum,表示这个结点表示的一段数字若为斐波那契数时的和 当进行3操作时,仅仅用将sum = fbsum就可以 其它操作照常进行,仅仅是单点更新 ...

  5. 线段树 + 区间更新: HDU 4893 Wow! Such Sequence!

    Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

  6. HDU 4893 Wow! Such Sequence! (线段树)

    Wow! Such Sequence! 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4893 Description Recently, Doge ...

  7. HDU 1394 Minimum Inversion Number (数据结构-段树)

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

  8. PKU A Simple Problem with Integers (段树更新间隔总和)

    意甲冠军:一个典型的段树C,Q问题,有n的数量a[i] (1~n),C, a, b,c在[a,b]加c Q a b 求[a,b]的和. #include<cstdio> #include& ...

  9. HDU 6356.Glad You Came-线段树(区间更新+剪枝) (2018 Multi-University Training Contest 5 1007)

    6356.Glad You Came 题意就是给你一个随机生成函数,然后从随机函数里确定查询的左右区间以及要更新的val值.然后最后求一下异或和就可以了. 线段树,区间最大值和最小值维护一下,因为数据 ...

随机推荐

  1. 关于mysql主从复制的概述与分类(转)

    一.概述: 按照MySQL的同步复制特点,大体上可以分为三种类别: 1.异步复制: 2.半同步复制: 3.完全同步的复制: -------------------------------------- ...

  2. OPENVPN开启用户password认证

    一.服务端配置 1.改动openvpn的主配置文件,加入例如以下内容 [root@ttt openvpn]# cat /etc/openvpn/server.conf |more #########a ...

  3. Sandcastle生成帮助文档

    http://www.cnblogs.com/net515/p/3311584.html Sandcastle帮助文档生成器使用介绍 一.软件介绍       Sandcastle是一个管理类库的文档 ...

  4. 十步完全理解SQL(转)

    本文由 伯乐在线 - 水果泡腾片 翻译.未经许可,禁止转载!英文出处:Lukas Eder.欢迎加入翻译组. 很多程序员视 SQL 为洪水猛兽.SQL 是一种为数不多的声明性语言,它的运行方式完全不同 ...

  5. lua学习笔记11:lua中的小技巧

    lua中的小技巧,即基础lua语言本身的特种,进行一个些简化的操作 一. 巧用or x = x or v 等价于: if not x then x = v end 假设x为nil或false,就给他赋 ...

  6. Oracle 学习笔记 17 -- 异常处理(PL/SQL)

    程序异常是在操作期间正常,出现在节目的准备过程是不可避免的例外.但是,必须有一个相应的异常处理机 制,以保证程序的正常运行.PL/SQL程序运行过程中出现的错误.称为异常. 一个优秀的程序都应该可以正 ...

  7. 【原创】《算法导论》链表一章带星习题试解——附C语言实现

    原题: 双向链表中,需要三个基本数据,一个携带具体数据,一个携带指向上一环节的prev指针,一个携带指向下一环节的next指针.请改写双向链表,仅用一个指针np实现双向链表的功能.定义np为next ...

  8. 找呀志_java网络编程(5)TCP和udp差额

    1.TCP定向链接,尽管该网络的不稳定性质,所述不安全确定多少次握手不能保证连接的可靠性.但TCP的三次握手至少(事实上确保了相当大的程度)以确保连接的可靠性; 和UDP不面向连接的,UDP前传送的数 ...

  9. c#错误捕获如何定位到某一行?

    e.ToString()在调试版本的程序(并且有pdb文件)的情况下会输出源代码行.

  10. CentOS 5 安装Oracle10g

    原创作品.离 "深蓝的blog" 博客.欢迎转载.转载时请务必注明下面出处,否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlon ...