#include<bits\stdc++.h>
using namespace std;
#define int long long
int mod = 1e9 + 7;
//insted of define the data type of tree int
// i will define it as node
// and i can do any edit i wont in future
// for any problem
struct node
{
int sum = 0;
int lazy = 1;
int bo = 0;
node(int x = 0) {
sum = x;
lazy = 1;
bo = 0;
}
};
// when i go to range is not in query range
// what i well return
//so i but it here to esay edit
node out()
{
return node((int)0);
}
// when your answer will come from two child nodes
//How will you compute the value for this node
node proces(node a, node b)
{
return node((a.sum + b.sum) % mod);
}
int const nn = 4e5 + 1;
int n;
int a[nn];
node tree1[nn];
// when will you build your tree i use one based
// s=1 e=n ind=1
void build_tree(node *tree, int s, int e, int ind)
{
if (s == e)
{
tree[ind] = node(a[s]);
return;
}
int mid = (s + e) / 2;
build_tree(tree, s, mid, ind * 2);
build_tree(tree, mid + 1, e, (ind * 2) + 1);
tree[ind] = proces(tree[ind * 2], tree[(ind * 2) + 1]);
return;
}
//ss segment start =1 se segment end =n l,r this is the range
// v is the lazy value
//ind =1
void updateRangeLazy(node *tree, int ss, int se, int l, int r, int v, int ind)
{
//before going down resolve the value if it exists
// i the node i reach has lazy value i need to execute this value
// and send the lazy value to the node's chidren
// and after that i go to see what i will do with this node
if (tree[ind].bo != 0)
{
//This process will
//change from one problem to another
tree[ind].sum *= tree[ind].lazy;
tree[ind].sum %= mod;
// non leaf node
// i will send the lazy value to my children
if (ss != se)
{
// this type of update tree[ind * 2].lazy += tree[ind].lazy;
// will change from porblem to another too
tree[ind * 2].lazy *= tree[ind].lazy;
tree[ind * 2 + 1].lazy *= tree[ind].lazy;
tree[ind * 2 + 1].bo = 1;
tree[ind * 2].lazy %= mod;
tree[ind * 2 + 1].lazy %= mod;
tree[ind * 2].bo = 1;
}
tree[ind].lazy = 1;
tree[ind].bo = 0;
}
// base case
// no overlap
if (ss > r || l > se)
return;
//another case- complete overlap case
// i will change the value for this node
// and will send lazy value to my children if i am not
// leaf node
if (ss >= l && se <= r)
{
// this process depend on this problem
tree[ind].sum *= v;
tree[ind].sum %= mod;
// create a new lazy value of children node
if (ss != se) {
tree[ind * 2].lazy *= v;
tree[ind * 2].lazy %= mod;
tree[ind * 2 + 1].lazy *= v;
tree[ind * 2 + 1].lazy %= mod;
tree[ind * 2].bo = 1;
tree[ind * 2 + 1].bo = 1;
}
return;
}
// if the case not complet overlap and not the first
// case this mean that is the third case when a part of
// the update is included and another part is out of range
// it is recursive case
int mid = (ss + se) / 2;
updateRangeLazy(tree, ss, mid, l, r, v, ind * 2);
updateRangeLazy(tree, mid + 1, se, l, r, v, ind * 2 + 1);
//update tree[ind]
tree[ind] = proces(tree[ind * 2], tree[ind * 2 + 1]);
return;
}
//ss segment start =1 se=segment end =n
// qs,qe is my question
//ind =1
node queryLazy(node *tree, int ss, int se, int qs, int qe, int ind) {
//before going down resolve the value if it exists
// i the node i reach has lazy value i need to execute this value
// and send the lazy value to the node's chidren
// and after that i go to see what i will do with this node
if (tree[ind].bo != 0)
{
//This process will
//change from one problem to another
tree[ind].sum *= tree[ind].lazy;
tree[ind].sum %= mod;
// non leaf node
// i will send the lazy value to my children
if (ss != se)
{
// this type of update tree[ind * 2].lazy += tree[ind].lazy;
// will change from porblem to another too
tree[ind * 2].lazy *= tree[ind].lazy;
tree[ind * 2 + 1].lazy *= tree[ind].lazy;
tree[ind * 2].lazy %= mod;
tree[ind * 2 + 1].lazy %= mod;
tree[ind * 2 + 1].bo = 1;
tree[ind * 2].bo = 1;
}
tree[ind].lazy = 1;
tree[ind].bo = 0;
}
// query logic
//no overlap
if (ss > qe || se < qs)
return out();
//complete overlap
if (ss >= qs && se <= qe)
return tree[ind];
// another case-third case
//recursive case
int mid = (ss + se) / 2;
node left = queryLazy(tree, ss, mid, qs, qe, ind * 2);
node right = queryLazy(tree, mid + 1, se, qs, qe, ind * 2 + 1);
return proces(left, right);
}
int32_t main()
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++)
a[i] = 1;
build_tree(tree1, 1, n, 1);
while (m--)
{
int ty;
cin >> ty;
if (ty == 1)
{
int l, r, v;
cin >> l >> r >> v;
l++;
updateRangeLazy(tree1, 1, n, l, r, v, 1);
}
else {
int l, r;
cin >> l >> r;
l++;
cout << queryLazy(tree1, 1, n, l, r, 1).sum << endl;
}
}
}
I2luY2x1ZGU8Yml0c1xzdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBpbnQgbG9uZyBsb25nCmludCBtb2QgPSAxZTkgKyA3OwovL2luc3RlZCBvZiBkZWZpbmUgdGhlIGRhdGEgdHlwZSBvZiB0cmVlIGludCAKLy8gaSB3aWxsIGRlZmluZSBpdCBhcyBub2RlIAovLyBhbmQgaSBjYW4gZG8gYW55IGVkaXQgaSB3b250IGluIGZ1dHVyZQovLyBmb3IgYW55IHByb2JsZW0Kc3RydWN0IG5vZGUKewoJaW50IHN1bSA9IDA7CglpbnQgbGF6eSA9IDE7CglpbnQgYm8gPSAwOwoJbm9kZShpbnQgeCA9IDApIHsKCQlzdW0gPSB4OwoJCWxhenkgPSAxOwoJCWJvID0gMDsKCX0KCn07Ci8vIHdoZW4gaSBnbyB0byByYW5nZSBpcyBub3QgaW4gcXVlcnkgcmFuZ2UgCi8vIHdoYXQgaSB3ZWxsIHJldHVybgovL3NvIGkgYnV0IGl0IGhlcmUgdG8gZXNheSBlZGl0Cm5vZGUgb3V0KCkKewoJcmV0dXJuIG5vZGUoKGludCkwKTsKfQovLyB3aGVuIHlvdXIgYW5zd2VyIHdpbGwgY29tZSBmcm9tIHR3byBjaGlsZCBub2RlcyAKLy9Ib3cgd2lsbCB5b3UgY29tcHV0ZSB0aGUgdmFsdWUgZm9yIHRoaXMgbm9kZQpub2RlIHByb2Nlcyhub2RlIGEsIG5vZGUgYikKewoJcmV0dXJuIG5vZGUoKGEuc3VtICsgYi5zdW0pICUgbW9kKTsKfQppbnQgY29uc3Qgbm4gPSA0ZTUgKyAxOwppbnQgbjsKaW50IGFbbm5dOwpub2RlIHRyZWUxW25uXTsKLy8gd2hlbiB3aWxsIHlvdSBidWlsZCB5b3VyIHRyZWUgaSB1c2Ugb25lIGJhc2VkCi8vIHM9MSAgZT1uICBpbmQ9MQp2b2lkIGJ1aWxkX3RyZWUobm9kZSAqdHJlZSwgaW50IHMsIGludCBlLCBpbnQgaW5kKQp7CglpZiAocyA9PSBlKQoJewoJCXRyZWVbaW5kXSA9IG5vZGUoYVtzXSk7CgkJcmV0dXJuOwoJfQoJaW50IG1pZCA9IChzICsgZSkgLyAyOwoJYnVpbGRfdHJlZSh0cmVlLCBzLCBtaWQsIGluZCAqIDIpOwoJYnVpbGRfdHJlZSh0cmVlLCBtaWQgKyAxLCBlLCAoaW5kICogMikgKyAxKTsKCXRyZWVbaW5kXSA9IHByb2Nlcyh0cmVlW2luZCAqIDJdLCB0cmVlWyhpbmQgKiAyKSArIDFdKTsKCXJldHVybjsKfQovL3NzIHNlZ21lbnQgc3RhcnQgPTEgIHNlIHNlZ21lbnQgZW5kID1uIGwsciB0aGlzIGlzIHRoZSByYW5nZQovLyB2IGlzIHRoZSBsYXp5IHZhbHVlIAovL2luZCA9MQp2b2lkIHVwZGF0ZVJhbmdlTGF6eShub2RlICp0cmVlLCBpbnQgc3MsIGludCBzZSwgaW50IGwsIGludCByLCBpbnQgdiwgaW50IGluZCkKewoJLy9iZWZvcmUgZ29pbmcgZG93biByZXNvbHZlIHRoZSB2YWx1ZSBpZiBpdCBleGlzdHMKCS8vIGkgdGhlIG5vZGUgaSByZWFjaCBoYXMgbGF6eSB2YWx1ZSBpIG5lZWQgdG8gZXhlY3V0ZSB0aGlzIHZhbHVlCgkvLyBhbmQgc2VuZCB0aGUgbGF6eSB2YWx1ZSB0byB0aGUgbm9kZSdzIGNoaWRyZW4gCgkvLyBhbmQgYWZ0ZXIgdGhhdCBpIGdvIHRvIHNlZSAgd2hhdCBpIHdpbGwgZG8gd2l0aCB0aGlzIG5vZGUKCglpZiAodHJlZVtpbmRdLmJvICE9IDApCgl7CgkJLy9UaGlzIHByb2Nlc3Mgd2lsbCAKCQkvL2NoYW5nZSBmcm9tIG9uZSBwcm9ibGVtIHRvIGFub3RoZXIKCQl0cmVlW2luZF0uc3VtICo9IHRyZWVbaW5kXS5sYXp5OwoJCXRyZWVbaW5kXS5zdW0gJT0gbW9kOwoJCS8vIG5vbiBsZWFmIG5vZGUgCgkJLy8gaSB3aWxsIHNlbmQgdGhlIGxhenkgdmFsdWUgdG8gbXkgY2hpbGRyZW4KCQlpZiAoc3MgIT0gc2UpCgkJewoJCQkvLyB0aGlzIHR5cGUgb2YgdXBkYXRlIHRyZWVbaW5kICogMl0ubGF6eSArPSB0cmVlW2luZF0ubGF6eTsKCQkJLy8gd2lsbCBjaGFuZ2UgZnJvbSBwb3JibGVtIHRvIGFub3RoZXIgdG9vCgkJCXRyZWVbaW5kICogMl0ubGF6eSAqPSB0cmVlW2luZF0ubGF6eTsKCQkJdHJlZVtpbmQgKiAyICsgMV0ubGF6eSAqPSB0cmVlW2luZF0ubGF6eTsKCQkJdHJlZVtpbmQgKiAyICsgMV0uYm8gPSAxOwoJCQl0cmVlW2luZCAqIDJdLmxhenkgJT0gbW9kOwoJCQl0cmVlW2luZCAqIDIgKyAxXS5sYXp5ICU9IG1vZDsKCQkJdHJlZVtpbmQgKiAyXS5ibyA9IDE7CgkJfQoJCXRyZWVbaW5kXS5sYXp5ID0gMTsKCQl0cmVlW2luZF0uYm8gPSAwOwoJfQoKCS8vIGJhc2UgIGNhc2UKCS8vIG5vIG92ZXJsYXAKCWlmIChzcyA+IHIgfHwgbCA+IHNlKQoJCXJldHVybjsKCgkvL2Fub3RoZXIgY2FzZS0gY29tcGxldGUgb3ZlcmxhcCBjYXNlCgkvLyBpIHdpbGwgY2hhbmdlIHRoZSB2YWx1ZSBmb3IgdGhpcyBub2RlIAoJLy8gYW5kIHdpbGwgc2VuZCBsYXp5IHZhbHVlIHRvIG15IGNoaWxkcmVuIGlmIGkgYW0gbm90CgkvLyBsZWFmIG5vZGUgCglpZiAoc3MgPj0gbCAmJiBzZSA8PSByKQoJewoJCS8vIHRoaXMgcHJvY2VzcyBkZXBlbmQgb24gdGhpcyBwcm9ibGVtIAoJCXRyZWVbaW5kXS5zdW0gKj0gdjsKCQl0cmVlW2luZF0uc3VtICU9IG1vZDsKCgkJLy8gY3JlYXRlIGEgbmV3IGxhenkgdmFsdWUgb2YgY2hpbGRyZW4gbm9kZQoJCWlmIChzcyAhPSBzZSkgewoJCQl0cmVlW2luZCAqIDJdLmxhenkgKj0gdjsKCQkJdHJlZVtpbmQgKiAyXS5sYXp5ICU9IG1vZDsKCQkJdHJlZVtpbmQgKiAyICsgMV0ubGF6eSAqPSB2OwoJCQl0cmVlW2luZCAqIDIgKyAxXS5sYXp5ICU9IG1vZDsKCQkJdHJlZVtpbmQgKiAyXS5ibyA9IDE7CgkJCXRyZWVbaW5kICogMiArIDFdLmJvID0gMTsKCQl9CgkJcmV0dXJuOwoJfQoJLy8gaWYgdGhlIGNhc2Ugbm90IGNvbXBsZXQgb3ZlcmxhcCBhbmQgbm90IHRoZSBmaXJzdCAKCS8vIGNhc2UgdGhpcyBtZWFuIHRoYXQgaXMgdGhlIHRoaXJkIGNhc2Ugd2hlbiBhIHBhcnQgb2YKCS8vIHRoZSB1cGRhdGUgaXMgaW5jbHVkZWQgYW5kIGFub3RoZXIgcGFydCBpcyBvdXQgb2YgcmFuZ2UKCS8vIGl0IGlzIHJlY3Vyc2l2ZSBjYXNlCgoJaW50IG1pZCA9IChzcyArIHNlKSAvIDI7Cgl1cGRhdGVSYW5nZUxhenkodHJlZSwgc3MsIG1pZCwgbCwgciwgdiwgaW5kICogMik7Cgl1cGRhdGVSYW5nZUxhenkodHJlZSwgbWlkICsgMSwgc2UsIGwsIHIsIHYsIGluZCAqIDIgKyAxKTsKCS8vdXBkYXRlIHRyZWVbaW5kXQoJdHJlZVtpbmRdID0gcHJvY2VzKHRyZWVbaW5kICogMl0sIHRyZWVbaW5kICogMiArIDFdKTsKCXJldHVybjsKfQovL3NzIHNlZ21lbnQgc3RhcnQgPTEgIHNlPXNlZ21lbnQgZW5kID1uIAovLyBxcyxxZSBpcyBteSBxdWVzdGlvbgovL2luZCA9MQpub2RlIHF1ZXJ5TGF6eShub2RlICp0cmVlLCBpbnQgc3MsIGludCBzZSwgaW50IHFzLCBpbnQgcWUsIGludCBpbmQpIHsKCS8vYmVmb3JlIGdvaW5nIGRvd24gcmVzb2x2ZSB0aGUgdmFsdWUgaWYgaXQgZXhpc3RzCgkvLyBpIHRoZSBub2RlIGkgcmVhY2ggaGFzIGxhenkgdmFsdWUgaSBuZWVkIHRvIGV4ZWN1dGUgdGhpcyB2YWx1ZQoJLy8gYW5kIHNlbmQgdGhlIGxhenkgdmFsdWUgdG8gdGhlIG5vZGUncyBjaGlkcmVuIAoJLy8gYW5kIGFmdGVyIHRoYXQgaSBnbyB0byBzZWUgIHdoYXQgaSB3aWxsIGRvIHdpdGggdGhpcyBub2RlCgoJaWYgKHRyZWVbaW5kXS5ibyAhPSAwKQoJewoJCS8vVGhpcyBwcm9jZXNzIHdpbGwgCgkJLy9jaGFuZ2UgZnJvbSBvbmUgcHJvYmxlbSB0byBhbm90aGVyCgkJdHJlZVtpbmRdLnN1bSAqPSB0cmVlW2luZF0ubGF6eTsKCQl0cmVlW2luZF0uc3VtICU9IG1vZDsKCQkvLyBub24gbGVhZiBub2RlIAoJCS8vIGkgd2lsbCBzZW5kIHRoZSBsYXp5IHZhbHVlIHRvIG15IGNoaWxkcmVuCgkJaWYgKHNzICE9IHNlKQoJCXsKCQkJLy8gdGhpcyB0eXBlIG9mIHVwZGF0ZSB0cmVlW2luZCAqIDJdLmxhenkgKz0gdHJlZVtpbmRdLmxhenk7CgkJCS8vIHdpbGwgY2hhbmdlIGZyb20gcG9yYmxlbSB0byBhbm90aGVyIHRvbwoJCQl0cmVlW2luZCAqIDJdLmxhenkgKj0gdHJlZVtpbmRdLmxhenk7CgkJCXRyZWVbaW5kICogMiArIDFdLmxhenkgKj0gdHJlZVtpbmRdLmxhenk7CgkJCXRyZWVbaW5kICogMl0ubGF6eSAlPSBtb2Q7CgkJCXRyZWVbaW5kICogMiArIDFdLmxhenkgJT0gbW9kOwoJCQl0cmVlW2luZCAqIDIgKyAxXS5ibyA9IDE7CgkJCXRyZWVbaW5kICogMl0uYm8gPSAxOwoJCX0KCQl0cmVlW2luZF0ubGF6eSA9IDE7CgkJdHJlZVtpbmRdLmJvID0gMDsKCX0KCS8vIHF1ZXJ5IGxvZ2ljIAoJLy9ubyBvdmVybGFwCQoJaWYgKHNzID4gcWUgfHwgc2UgPCBxcykKCQlyZXR1cm4gb3V0KCk7CgoJLy9jb21wbGV0ZSBvdmVybGFwCglpZiAoc3MgPj0gcXMgJiYgc2UgPD0gcWUpCgkJcmV0dXJuIHRyZWVbaW5kXTsKCS8vIGFub3RoZXIgY2FzZS10aGlyZCBjYXNlCgkvL3JlY3Vyc2l2ZSBjYXNlCglpbnQgbWlkID0gKHNzICsgc2UpIC8gMjsKCW5vZGUgbGVmdCA9IHF1ZXJ5TGF6eSh0cmVlLCBzcywgbWlkLCBxcywgcWUsIGluZCAqIDIpOwoJbm9kZSByaWdodCA9IHF1ZXJ5TGF6eSh0cmVlLCBtaWQgKyAxLCBzZSwgcXMsIHFlLCBpbmQgKiAyICsgMSk7CglyZXR1cm4gIHByb2NlcyhsZWZ0LCByaWdodCk7Cgp9CmludDMyX3QgbWFpbigpCnsKCWludCBuLCBtOwoJY2luID4+IG4gPj4gbTsKCWZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykKCQlhW2ldID0gMTsKCWJ1aWxkX3RyZWUodHJlZTEsIDEsIG4sIDEpOwoJd2hpbGUgKG0tLSkKCXsKCQlpbnQgdHk7CgkJY2luID4+IHR5OwoJCWlmICh0eSA9PSAxKQoJCXsKCQkJaW50IGwsIHIsIHY7CgkJCWNpbiA+PiBsID4+IHIgPj4gdjsKCQkJbCsrOwoJCQl1cGRhdGVSYW5nZUxhenkodHJlZTEsIDEsIG4sIGwsIHIsIHYsIDEpOwoJCX0KCQllbHNlIHsKCQkJaW50IGwsIHI7CgkJCWNpbiA+PiBsID4+IHI7CgkJCWwrKzsKCQkJY291dCA8PCBxdWVyeUxhenkodHJlZTEsIDEsIG4sIGwsIHIsIDEpLnN1bSA8PCBlbmRsOwoJCX0KCX0KCn0=