1 #include<iostream>
2 #include<stdio.h>
3 #include<cstring>
4 #include<cstdlib>
5 #include<queue>
6 #include<math.h>
7 #include<algorithm>
8 #include<vector>
9 #define maxx 100010
10 using namespace std;
11 #define ss __int64
12
13 struct node {int l,r;ss sum; bool flag;};
14 node tree[maxx*4];
15 ss f[100];
16
17 void getfib()
18 {
19 f[0]=f[1]=1;
20 for(int i=2;i<=90;i++)
21 {
22 f[i]=f[i-1]+f[i-2];
23 //printf("%I64d\n",f[i]);
24 }
25 }
26
27 int solve(ss x) //jiang x bian wei zui jin d fib
28 {
29 int l=0,r=90,best=0;
30 while(l<r)
31 {
32 int mid=(l+r)/2;
33 if(f[mid]<=x)
34 {
35 l=mid+1;
36 best=max(best,mid);
37 }
38 else
39 r=mid-1;
40 }
41 return best;
42 }
43
44 void build(int left,int right,int k)
45 {
46 int mid;
47 tree[k].l=left;
48 tree[k].r=right;
49 tree[k].sum=0;
50 tree[k].flag=false;
51 if(left==right)
52 return ;
53 mid=(left+right)/2;
54 build(left,mid,k*2);
55 build(mid+1,right,k*2+1);
56 }
57
58 void down(int k)
59 {
60 if(tree[k].flag==false)
61 return ;
62 tree[k].flag=false;
63 if(tree[k].l==tree[k].r)
64 {
65
66 int temp,a,b;
67 temp=solve(tree[k].sum);
68 printf("1----%d\n",tree[k].sum);
69 a=abs(tree[k].sum-f[temp]);
70 b=abs(tree[k].sum-f[temp+1]);
71 if(a<b)
72 {
73 tree[k].sum=f[temp];
74 }
75 else if(a==b)
76 {
77 tree[k].sum=min(f[temp],f[temp+1]);
78 }
79 else
80 tree[k].sum=f[temp+1];
81 printf("2------%d\n",tree[k].sum);
82 return ;
83
84 }
85 down(k*2);
86 down(k*2+1);
87 tree[k].sum=tree[k*2].sum+tree[k*2+1].sum;
88 }
89
90 int sum(int left,int right,int k)
91 {
92 if(tree[k].l==left&&tree[k].r==right)
93 {
94 if(tree[k].flag)
95 down(k);
96 return tree[k].sum;
97 }
98 int mid;
99 mid=(tree[k].l+tree[k].r)/2;
100 if(right<=mid)
101 return sum(left,right,k*2);
102 else if(left>=mid+1)
103 return sum(left,right,k*2+1);
104 else
105 return sum(left,mid,k*2)+sum(mid+1,right,k*2+1);
106 }
107
108 void add(int x,int zhi,int k)
109 {
110 if(tree[k].l==x&&x==tree[k].r)
111 {
112 if(tree[k].flag)
113 down(k);
114 tree[k].sum+=zhi;
115 return ;
116 }
117 int mid;
118 mid=(tree[k].l+tree[k].r)/2;
119 if(x<=mid)
120 add(x,zhi,k*2);
121 else
122 add(x,zhi,k*2+1);
123 tree[k].sum=tree[k*2].sum+tree[k*2+1].sum;
124 }
125
126 void biaoji(int left,int right,int k)
127 {
128 if(tree[k].l==left&&tree[k].r==right)
129 {
130 printf("biao %d %d\n",tree[k].l,tree[k].r);
131 tree[k].flag=true;
132 return ;
133 }
134 int mid;
135 mid=(tree[k].l+tree[k].r)/2;
136 if(right<=mid)
137 biaoji(left,right,k*2);
138 else if(left>=mid+1)
139 biaoji(left,right,k*2+1);
140 else
141 {
142 biaoji(left,mid,k*2);
143 biaoji(mid+1,right,k*2+1);
144 }
145 }
146
147 int main()
148 {
149 int i,j,n,m,a,b,c;
150 getfib();
151 while(~scanf("%d%d",&n,&m))
152 {
153 build(1,n,1);
154 while(m--)
155 {
156 scanf("%d%d%d",&a,&b,&c);
157 if(a==1)
158 add(b,c,1);
159 if(a==2)
160 printf("%d\n",sum(b,c,1));
161 if(a==3)
162 biaoji(b,c,1);
163 }
164 }
165 return 0;
166 }