Guest User

Untitled

a guest
Jul 2nd, 2016
497
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.91 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define MAX 100007
  3. #define mp make_pair
  4.  
  5. using namespace std;
  6.  
  7. typedef long long ll;
  8.  
  9. ll mod = 1e9+7;
  10. ll arr[MAX];
  11. ll lazy[4*MAX];
  12. ll maxx[4*MAX];
  13. ll minn[4*MAX];
  14. ll lcm[3*MAX];
  15.  
  16. void init(ll node, ll b, ll e)
  17. {
  18.     if (b==e)
  19.     {
  20.         maxx[node]=arr[b];
  21.         minn[node]=arr[b];
  22.         lazy[node]=0;
  23.         return;
  24.     }
  25.     ll left=node*2;
  26.     ll right=node*2+1;
  27.     ll mid=(b+e)/2;
  28.     init(left, b, mid);
  29.     init(right, mid+1, e);
  30.     maxx[node]=max(maxx[left], maxx[right]);
  31.     minn[node]=min(minn[left], minn[right]);
  32.     return;
  33. }
  34.  
  35. void update(ll node, ll b, ll e, ll i, ll j, ll x)
  36. {
  37.     if (i > e || j < b)
  38.         return;
  39.     if (b >= i && e <= j)
  40.     {
  41.         maxx[node]+=x;
  42.         minn[node]+=x;
  43.         lazy[node]+=x;
  44.         return;
  45.     }
  46.     ll left = node * 2;
  47.     ll right = (node * 2) + 1;
  48.     ll mid = (b + e) / 2;
  49.     update(left, b, mid, i, j, x);
  50.     update(right, mid + 1, e, i, j, x);
  51.     maxx[node]=max(maxx[left], maxx[right]);
  52.     minn[node]=min(minn[left], minn[right]);
  53.     return;
  54. }
  55.  
  56. pair<ll, ll> query(ll node, ll b, ll e, ll i, ll j, ll carry = 0)
  57. {
  58.     if (i > e || j < b)
  59.         return mp(-1, 4*MAX);
  60.  
  61.     if (b >= i and e <= j)
  62.     {
  63.         return mp(maxx[node]+carry, minn[node]+carry);
  64.     }
  65.  
  66.     ll left = node << 1;
  67.     ll right = (node << 1) + 1;
  68.     ll mid = (b + e) >> 1;
  69.  
  70.     pair<ll, ll> p1 = query(left, b, mid, i, j, carry + lazy[node]);
  71.     pair<ll, ll> p2 = query(right, mid + 1, e, i, j, carry + lazy[node]);
  72.  
  73.     pair<ll, ll> p;
  74.     p.first = max(p1.first, p2.first);
  75.     p.second = min(p1.second, p2.second);
  76.     return p;
  77. }
  78.  
  79. int main ()
  80. {
  81.     ll ord, n, q, i, j, k, l, x, y, r, m;
  82.     lcm[0]=0, lcm[1]=1;
  83.     for (i=2; i<3*MAX; i++)
  84.     {
  85.         lcm[i]=0;
  86.     }
  87.     for (i=2; i<3*MAX; i++)
  88.     {
  89.         if (lcm[i]==0)
  90.         {
  91.             for (j=2*i; j<3*MAX; j+=i)
  92.             {
  93.                 lcm[j]=1;
  94.             }
  95.             for (j=i; j<3*MAX; j*=i)
  96.             {
  97.                 lcm[j]=i;
  98.             }
  99.         }
  100.         lcm[i]=lcm[i-1]*lcm[i];
  101.         lcm[i]%=mod;
  102.     }
  103.     for (i=0; i<4*MAX; i++)
  104.     {
  105.         maxx[i]=-1;
  106.         minn[i]=4*MAX;
  107.         lazy[i]=0;
  108.     }
  109.     scanf("%lld%lld", &n, &q);
  110.     for (i=0; i<n; i++)
  111.     {
  112.         scanf("%lld", &arr[i]);
  113.     }
  114.     init (1, 0, n-1);
  115.     for (i=0; i<q; i++)
  116.     {
  117.         scanf("%lld", &ord);
  118.         if (ord==0)
  119.         {
  120.             scanf("%lld%lld%lld", &x, &y, &k);
  121.             update(1, 0, n-1, x, y, k);
  122.         }
  123.         else
  124.         {
  125.             scanf("%lld%lld", &x, &y);
  126.             pair<ll, ll> p1 = query(1, 0, n-1, x, y);
  127.             if (ord==1)
  128.             {
  129.                 printf("%lld\n", lcm[p1.first]);
  130.             }
  131.             else if (ord==2)
  132.             {
  133.                 printf("%lld\n", lcm[p1.second]);
  134.             }
  135.         }
  136.     }
  137.     return 0;
  138. }
Advertisement
Add Comment
Please, Sign In to add comment