Advertisement
Guest User

Untitled

a guest
Nov 16th, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.37 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. #define ull unsigned long long
  4. #define pii pair<int,int>
  5. using namespace std;
  6.  
  7. const int MM = 1e5+5;
  8. struct node{
  9.     int l,r,v,g,f;
  10. }seg [3*MM];
  11.  
  12. int N,M;
  13. char op;
  14. void pushUp(int id){
  15.     seg[id].v = min(seg[2*id].v,seg[2*id+1].v);
  16.     seg[id].g = __gcd(seg[2*id].g,seg[2*id+1].g);
  17.     seg[id].f = 0;
  18.     if(seg[id].g == seg[2*id].g) seg[id].f += seg[2*id].f;
  19.     if(seg[id].g == seg[2*id+1].g) seg[id].f += seg[2*id+1].f;
  20. }
  21. void build(int l, int r, int id){
  22.     seg[id].l = l;
  23.     seg[id].r = r;
  24.     if(l==r){
  25.         scanf("%d", &seg[id].v);
  26.         seg[id].g = seg[id].v;
  27.         seg[id].f = 1;
  28.         return;
  29.     }
  30.     int mid = (seg[id].l + seg[id].r)/2;
  31.     build(l,mid,2*id);
  32.     build(mid+1,r,2*id+1);
  33.     pushUp(id);
  34. }
  35. void update(int pos, int val, int id){
  36.     if(seg[id].l == pos && seg[id].r == pos){
  37.         seg[id].v = seg[id].g = val;
  38.         return;
  39.     }
  40.     int mid = (seg[id].l + seg[id].r)/2;
  41.     if(pos<=mid)update(pos,val,2*id);
  42.     else update(pos,val,2*id+1);
  43.     pushUp(id);
  44. }
  45. int qryMin(int l, int r, int id){
  46.     if(seg[id].l == l && seg[id].r == r) return seg[id].v;
  47.     int mid = (seg[id].l + seg[id].r)/2;
  48.     if(r<=mid)return qryMin(l,r,2*id);
  49.     else if(l>mid) return qryMin(l,r,2*id+1);
  50.     else return min(qryMin(l,mid,2*id),qryMin(mid+1,r,2*id+1));
  51. }
  52. int qryGcd(int l, int r, int id){
  53.     if(seg[id].l == l && seg[id].r == r) return seg[id].g;
  54.     int mid = (seg[id].l + seg[id].r)/2;
  55.     if(r<=mid)return qryGcd(l,r,2*id);
  56.     else if(l>mid) return qryGcd(l,r,2*id+1);
  57.     else return __gcd(qryGcd(l,mid,2*id),qryGcd(mid+1,r,2*id+1));
  58. }
  59. int qryCnt (int l, int r, int g, int id){
  60.     if(seg[id].l == l && seg[id].r == r)return g == seg[id].g ? seg[id].f : 0;
  61.     int mid = (seg[id].l+seg[id].r)/2;
  62.     if(r<=mid)return(qryCnt(l,r,g,2*id));
  63.     if(l>mid)return(qryCnt(l,r,g,2*id+1));
  64.     return qryCnt(l,mid,g,2*id)+qryCnt(mid+1,r,g,2*id+1);
  65. }
  66. int main() {
  67.     scanf("%d %d", &N, &M);
  68.     build(1,N,1);
  69.     for(int i = 1,x,y; i<=M;i++){
  70.         scanf(" %c %d %d", &op, &x, &y);
  71.         if(op == 'C')update(x,y,1);
  72.         else if(op == 'M')printf("%d\n", qryMin(x,y,1));
  73.         else if(op == 'G')printf("%d\n", qryGcd(x,y,1));
  74.         else if(op == 'Q'){
  75.             int g = qryGcd(x,y,1);
  76.             printf("%d\n", qryCnt(x,y,g,1));
  77.         }
  78.     }
  79.     return 0;
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement