Advertisement
Guest User

interval product using BIT

a guest
May 27th, 2019
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.68 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef int ll;
  4. typedef unsigned long long ull;
  5. typedef pair<ll,ll>pll;
  6. typedef pair<int,int>pii;
  7. typedef pair<int,pair<int,int>>piii;
  8. typedef pair<ll,pair<ll,ll>>plll;
  9. #define fastread() (ios_base:: sync_with_stdio(false),cin.tie(NULL));
  10. #define sf(a) scanf("%I64d",&a)
  11. #define pf(a) printf("%I64d\n",a)
  12. #define mem(a,b) memset(a,b,sizeof(a))
  13. #define vll(v) v.begin(),v.end()
  14. #define all(x) x.rbegin(),x.rend()
  15. #define min3(a, b, c) min(a, min(b, c))
  16. #define F first
  17. #define S second
  18. #define minheap int,vector<int>,greater<int>
  19. //#define mp make_pair
  20. #define pb push_back
  21. #define pp pop_back
  22. #define eb emplace_back
  23. #define in freopen("input.txt", "r", stdin)
  24. #define out freopen("output.txt", "w", stdout)
  25. #define BOUNDARY(i, j) ((i >= 0 && i < row) && (j >= 0 && j < column))
  26. #define ischar(x) (('a' <= x && x <= 'z') || ('A' <= x && x <= 'Z'))
  27. #define isvowel(ch) ((ch=='a'||ch=='e'||ch=='i'||ch=='o'||ch=='u')||(ch=='A'|| ch=='E' || ch=='I'|| ch=='O'|| ch=='U'))
  28. const int Max = 1e5 + 10;
  29. const int Mod = 1e9 + 7;
  30. const double PI =3.141592653589793238463;
  31. bool compare(const pair<int,int> &a, const pair<int,int> &b)
  32. {
  33. return (a.first > b.first);
  34. }
  35. ll lcm(ll a,ll b)
  36. {
  37. if(a==0 || b==0)
  38. return 0;
  39.  
  40. return a/__gcd(a,b)*b;
  41. }
  42. //___________________________________________________________________________________________________________________
  43. // CODE STARTS FROM HERE
  44. // MU_Codefighter2019
  45. //-------------------------------------------------------------------------------------------------------------------
  46.  
  47. ll tree[2][Max];
  48.  
  49. ll query(ll idx, ll z)
  50. {
  51. ll sum=0;
  52.  
  53. while(idx>0)
  54. {
  55. sum+=tree[z][idx];
  56.  
  57. idx-= idx & (-idx);
  58.  
  59. }
  60.  
  61. return sum;
  62. }
  63.  
  64. void update(ll idx,ll x,ll n,ll z)
  65. {
  66. while(idx<=n)
  67. {
  68. tree[z][idx]+=x;
  69.  
  70. idx+= idx & (-idx);
  71. }
  72. }
  73.  
  74. void init()
  75. {
  76. int i,j;
  77.  
  78. for(i=0; i<2; i++)
  79. for(j=0; j<Max; j++)tree[i][j]=0;
  80. }
  81. int main()
  82. {
  83. fastread();
  84.  
  85.  
  86.  
  87.  
  88. fastread();
  89. ll n,q,i;
  90.  
  91. char ch,ah;
  92.  
  93.  
  94. while(scanf("%d %d",&n,&q)==2)
  95. {
  96. init();
  97.  
  98. ll ara[n+1],z;
  99.  
  100. for(i=1; i<=n; i++)
  101. {
  102. scanf("%d",&ara[i]);
  103.  
  104. if(ara[i]<=0)
  105.  
  106. {
  107. if(ara[i]==0)
  108. z=0;
  109.  
  110. else if(ara[i]<0)
  111. {
  112. ara[i]=-1;
  113. z=1;
  114. }
  115.  
  116. update(i,1,n,z);
  117. }
  118.  
  119. }
  120.  
  121.  
  122. while(q--)
  123. {
  124. // n=Max;
  125. ll i,j,ans;
  126.  
  127. scanf("\n%c %d %d",&ch,&i,&j);
  128.  
  129. switch(ch)
  130. {
  131.  
  132. case 'P':
  133. {
  134.  
  135. ll neg=query(j,1)-query(i-1,1);
  136.  
  137. ll zero=query(j,0)-query(i-1,0);
  138.  
  139. if(zero)
  140. ans=0;
  141.  
  142. else if(neg%2)
  143. ans=-1;
  144.  
  145. else
  146. ans=1;
  147.  
  148. switch(ans)
  149. {
  150. case -1:
  151. ah='-';
  152. break;
  153.  
  154. case 1:
  155. ah='+';
  156.  
  157. break;
  158.  
  159. case 0:
  160. ah='0';
  161. }
  162. printf("%c",ah);
  163.  
  164. break;
  165. }
  166.  
  167. case 'C':
  168.  
  169. if(j>0)
  170. {
  171. j=1;
  172. if(ara[i]==0)
  173. {
  174. update(i,-1,n,0);
  175.  
  176. }
  177. else if(ara[i]<0)
  178. {
  179. update(i,-1,n,1);
  180. }
  181.  
  182. ara[i]=j;
  183. }
  184.  
  185. else if(j==0)
  186. {
  187. if(ara[i]<0)
  188. {
  189. update(i,-1,n,1);
  190. update(i,1,n,0);
  191. }
  192. else if(ara[i]>0)
  193. {
  194. update(i,1,n,0);
  195. }
  196.  
  197. ara[i]=0;
  198. }
  199. else
  200. {
  201. if(ara[i]==0)
  202. {
  203. update(i,-1,n,0);
  204. update(i,1,n,1);
  205. }
  206. else if(ara[i]>0)
  207. {
  208. update(i,1,n,1);
  209. }
  210.  
  211. ara[i]=-1;
  212. }
  213.  
  214. }
  215.  
  216.  
  217. }
  218. printf("\n");
  219. }
  220.  
  221.  
  222.  
  223.  
  224.  
  225.  
  226.  
  227. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement