标签:
1 1 2 1 1 5 4 1 1 7 1 3 17 3 2 4 2 1 5
0 22
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long int LL;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int maxn=110000;
LL sum[maxn<<2],fibsum[maxn<<2],fib[100];
bool cov[maxn<<2];
void GET_FIB()
{
	fib[0]=fib[1]=1LL;
	for(int i=2;i<100;i++)
		fib[i]=fib[i-1]+fib[i-2];
}
LL CHANGE(LL x)
{
	int mark=-1;LL mx=99999999999LL;
	for(int i=0;i<100;i++)
	{
		if(abs(x-fib[i])<mx)
		{
			mx=abs(x-fib[i]); mark=i;
		}
	}
	return fib[mark];
}
void push_up(int rt)
{
	sum[rt]=sum[rt<<1]+sum[rt<<1|1];
	fibsum[rt]=fibsum[rt<<1]+fibsum[rt<<1|1];
}
void push_down(int l,int r,int rt)
{
	if(l==r) return ;
	if(cov[rt])
	{
		sum[rt<<1]=fibsum[rt<<1];
		sum[rt<<1|1]=fibsum[rt<<1|1];
		cov[rt<<1]=cov[rt<<1|1]=cov[rt];
		cov[rt]=0;
	}
}
void build(int l,int r,int rt)
{
	sum[rt]=0,fibsum[rt]=1,cov[rt]=0;
	if(l==r) return ;
	int m=(l+r)/2;
	build(lson); build(rson);	
	push_up(rt);
}
void ADD(int Kth,LL d,int l,int r,int rt)
{
	push_down(l,r,rt);
	if(l==r)
	{
		sum[rt]+=d;
		fibsum[rt]=CHANGE(sum[rt]);
		return ;
	}
	int m=(l+r)/2;
	if(Kth<=m) ADD(Kth,d,lson);
	else ADD(Kth,d,rson);
	push_up(rt);
}
LL query(int L,int R,int l,int r,int rt)
{
	if(L<=l&&r<=R)
	{
		return sum[rt];
	}
	push_down(l,r,rt);
	int m=(l+r)/2;
	LL ret=0;
	if(L<=m) ret+=query(L,R,lson);
	if(R>m)	ret+=query(L,R,rson);
	return ret;
}
void C_F(int L,int R,int l,int r,int rt)
{
	if(L<=l&&r<=R)
	{
		cov[rt]=1;
		sum[rt]=fibsum[rt];
		return ;	
	}
	push_down(l,r,rt);
	int m=(l+r)/2;
	if(L<=m) C_F(L,R,lson);
	if(R>m) C_F(L,R,rson);	
	push_up(rt);
}
int main()
{
	int n,m;
	GET_FIB();
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		build(1,n,1);
		LL a,b,c;
		while(m--)
		{
			scanf("%I64d%I64d%I64d",&a,&b,&c);
			if(a==1)	
				ADD(b,c,1,n,1);
			else if(a==2)
				printf("%I64d\n",query(b,c,1,n,1));
			else if(a==3)
				C_F(b,c,1,n,1);
		}
	}
	return 0;
}
标签:
原文地址:http://www.cnblogs.com/mengfanrong/p/4592908.html