Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define MAX 100007
- #define mp make_pair
- using namespace std;
- typedef long long ll;
- ll mod = 1e9+7;
- ll arr[MAX];
- ll lazy[4*MAX];
- ll maxx[4*MAX];
- ll minn[4*MAX];
- ll lcm[3*MAX];
- void init(ll node, ll b, ll e)
- {
- if (b==e)
- {
- maxx[node]=arr[b];
- minn[node]=arr[b];
- lazy[node]=0;
- return;
- }
- ll left=node*2;
- ll right=node*2+1;
- ll mid=(b+e)/2;
- init(left, b, mid);
- init(right, mid+1, e);
- maxx[node]=max(maxx[left], maxx[right]);
- minn[node]=min(minn[left], minn[right]);
- return;
- }
- void update(ll node, ll b, ll e, ll i, ll j, ll x)
- {
- if (i > e || j < b)
- return;
- if (b >= i && e <= j)
- {
- maxx[node]+=x;
- minn[node]+=x;
- lazy[node]+=x;
- return;
- }
- ll left = node * 2;
- ll right = (node * 2) + 1;
- ll mid = (b + e) / 2;
- update(left, b, mid, i, j, x);
- update(right, mid + 1, e, i, j, x);
- maxx[node]=max(maxx[left], maxx[right]);
- minn[node]=min(minn[left], minn[right]);
- return;
- }
- pair<ll, ll> query(ll node, ll b, ll e, ll i, ll j, ll carry = 0)
- {
- if (i > e || j < b)
- return mp(-1, 4*MAX);
- if (b >= i and e <= j)
- {
- return mp(maxx[node]+carry, minn[node]+carry);
- }
- ll left = node << 1;
- ll right = (node << 1) + 1;
- ll mid = (b + e) >> 1;
- pair<ll, ll> p1 = query(left, b, mid, i, j, carry + lazy[node]);
- pair<ll, ll> p2 = query(right, mid + 1, e, i, j, carry + lazy[node]);
- pair<ll, ll> p;
- p.first = max(p1.first, p2.first);
- p.second = min(p1.second, p2.second);
- return p;
- }
- int main ()
- {
- ll ord, n, q, i, j, k, l, x, y, r, m;
- lcm[0]=0, lcm[1]=1;
- for (i=2; i<3*MAX; i++)
- {
- lcm[i]=0;
- }
- for (i=2; i<3*MAX; i++)
- {
- if (lcm[i]==0)
- {
- for (j=2*i; j<3*MAX; j+=i)
- {
- lcm[j]=1;
- }
- for (j=i; j<3*MAX; j*=i)
- {
- lcm[j]=i;
- }
- }
- lcm[i]=lcm[i-1]*lcm[i];
- lcm[i]%=mod;
- }
- for (i=0; i<4*MAX; i++)
- {
- maxx[i]=-1;
- minn[i]=4*MAX;
- lazy[i]=0;
- }
- scanf("%lld%lld", &n, &q);
- for (i=0; i<n; i++)
- {
- scanf("%lld", &arr[i]);
- }
- init (1, 0, n-1);
- for (i=0; i<q; i++)
- {
- scanf("%lld", &ord);
- if (ord==0)
- {
- scanf("%lld%lld%lld", &x, &y, &k);
- update(1, 0, n-1, x, y, k);
- }
- else
- {
- scanf("%lld%lld", &x, &y);
- pair<ll, ll> p1 = query(1, 0, n-1, x, y);
- if (ord==1)
- {
- printf("%lld\n", lcm[p1.first]);
- }
- else if (ord==2)
- {
- printf("%lld\n", lcm[p1.second]);
- }
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment