forked from striver79/Competitive_Codes-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlazytree.cpp
111 lines (76 loc) · 2.04 KB
/
lazytree.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <bits/stdc++.h>
using namespace std;
#define m 1000000007
void lt1(int lazy[], int a, int b, int i, int j, int node,int value) {
if(lazy[node] != 0) {
if(a != b) {
lazy[node*2+1] =(lazy[node*2+1]%m+ lazy[node]%m)%m;
lazy[node*2+2] =(lazy[node*2+2]%m+ lazy[node]%m)%m;
lazy[node] = 0;
}
}
if(a > b || a > j || b < i)
return;
if(a >= i && b <= j) {
lazy[node] =(lazy[node]%m + value%m)%m;
return;
}
lt1(lazy, a, (a+b)/2, i, j, 2*node+1,value);
lt1(lazy, 1+(a+b)/2, b, i, j,2*node+2, value);
}
int query_tree(int lazy[], int a, int b, int i, int j,int node) {
if(a > b || a > j || b < i) return -1;
if(lazy[node] != 0) {
if(a != b) {
lazy[node*2+1] =(lazy[node*2+1]%m+ lazy[node]%m)%m;
lazy[node*2+2] =(lazy[node*2+2]%m+ lazy[node]%m)%m;
lazy[node] = 0;
}
}
if(a >= i && b <= j)
return lazy[node]%m;
int q1 = query_tree(lazy, a, (a+b)/2, i, j,2*node+1);
int q2 = query_tree(lazy, 1+(a+b)/2, b, i, j,2*node+2);
int res = max(q1%m, q2%m);
return res%m;
}
int main() {
int t;
cin >> t;
while(t--)
{
int n,q;
cin >> n>> q;
int i=0;
int h=q;
int height = (int)(ceil(log2(n)));
int max_size = 2*(int)pow(2, height)+1 ;
int ans[max_size] = {0};
int h2 = (int)(ceil(log2(h)));
int maxSize = 2*(int)pow(2, h2) +1;
int lazy[maxSize] = {0};
int a[h][3];
while(q--)
{
cin >> a[i][0]>>a[i][1]>>a[i][2];
i++;
}
for(int j=h-1;j>=0;j--)
{
if (a[j][0]==2)
{
lt1(lazy,0,h-1,a[j][1]-1,a[j][2]-1,0,query_tree(lazy,0,h-1,j,j,0)+1);
}
else
{
lt1(ans,0,n-1,a[j][1]-1,a[j][2]-1,0,query_tree(lazy,0,h-1,j,j,0)+1);
}
}
for(int i=0;i<n;i++)
{
cout << query_tree(ans,0,n-1,i,i,0)<<" ";
}
cout << endl;
}
return 0;
}