Advertisement
a53

Actualizare Element, CMMDC Interval

a53
Jul 27th, 2017
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.38 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define nmax 100001
  3. using namespace std;
  4. ifstream f("aecmmdci.in");
  5. ofstream g("aecmmdci.out");
  6. int arb[4*nmax+55];
  7. int i,n,v,m,midc,x,y,t;
  8.  
  9. int cmmdc(int a,int b)
  10. {
  11. int r;
  12. if(a==0&&b==0)
  13. return -1;
  14. else
  15. {
  16. if(a<b)
  17. swap(a,b);
  18. if(b==0)
  19. return a;
  20. else
  21. {
  22. r=a%b;
  23. while(r!=0)
  24. {
  25. a=b;
  26. b=r;
  27. r=a%b;
  28. }
  29. return b;
  30. }
  31. }
  32. }
  33.  
  34. void update(int nod,int st,int dr,int poz,int val)
  35. {
  36. if(st==dr)
  37. {
  38. arb[nod]=val;
  39. return;
  40. }
  41. int mij=(st+dr)/2;
  42. if(poz<=mij)update(2*nod,st,mij,poz,val);
  43. else update(2*nod+1,mij+1,dr,poz,val);
  44. arb[nod]=cmmdc(arb[2*nod],arb[2*nod+1]);
  45. }
  46.  
  47. void query(int nod,int st,int dr,int a,int b)
  48. {
  49. if(a<=st&&dr<=b)
  50. {
  51. midc=cmmdc(midc,arb[nod]);
  52. return;
  53. }
  54. int mij=(st+dr)/2;
  55. if(a<=mij)query(2*nod,st,mij,a,b);
  56. if(mij<b)query(2*nod+1,mij+1,dr,a,b);
  57. }
  58.  
  59. int main()
  60. {
  61. f>>n;
  62. for(i=1;i<=n;++i)
  63. {
  64. f>>v;
  65. update(1,1,n,i,v);
  66. }
  67. f>>m;
  68. while(m--)
  69. {
  70. f>>t>>x>>y;
  71. if(t==1)
  72. midc=0,query(1,1,n,x,y),g<<midc<<'\n';
  73. else
  74. update(1,1,n,x,y);
  75. }
  76. return 0;
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement