Advertisement
Guest User

lezy prop segment

a guest
Jun 29th, 2016
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.13 KB | None | 0 0
  1. /// TANVIR HASAN
  2.  
  3. #include <bits/stdc++.h>
  4. using namespace std;
  5.  
  6. #define uu first
  7. #define vv second
  8. #define pb push_back
  9. #define mp make_pair
  10. #define LL long long
  11. #define inf INT_MAX/3
  12. #define mod 1000000007ll
  13. #define PI acos(-1.0)
  14. #define linf (1ll<<60)-1
  15. #define pii pair<int,int>
  16. #define vl vector<LL>
  17. #define vi vector<int>
  18. #define vs vector<string>
  19. #define pii pair<int,int>
  20.  
  21. #define ALL(A) (A).begin(),(A).end()
  22. #define mset(a,v) memset(a,v,sizeof a)
  23. #define setinf(ar) memset(ar,126,sizeof ar)
  24. #define vsort(v) sort(v.begin(),v.end())
  25.  
  26. #define FOR(I,A,B) for (__typeof (B) I = (A) ; I <= B ; ++I)
  27. #define rof(i, a, b) for (__typeof (b)i = (b) ; i >= a ; --i)
  28. #define rep(I, n) for (__typeof (n) I = 0 ; I < n ; ++I)
  29. #define per(i, n) for (__typeof (n)i = (n-1) ; i >= 0 ; --i)
  30. #define forstl(I, s) for (__typeof ((s).end ()) I = (s).begin (); I != (s).end (); ++I)
  31. #define rofstl(I, s) for (__typeof ((s).end ()) I = (s).end ()-1; I != (s).begin (); --I)
  32.  
  33. #define Int ({int a; scanf("%d", &a); a;})
  34. #define I64 ({LL a; scanf("%I64d", &a); a;})
  35. #define Double ({double a; scanf("%lf", &a); a;})
  36. #define Char ({char a; scanf("%c", &a); a;})
  37.  
  38. #define En "\n"
  39. #define round(a,b,n) ((a-1+b)% n + n)% n + 1 /// 1 base round,, a starting index ,,+b for left to right,,-b for left,|b| turn,,total n gor
  40. #define tata return 0
  41. /// error////////////////////
  42.  
  43. #define error(args...) { vector<string> _v = split(#args, ','); err(_v.begin(), args); puts(""); }
  44.  
  45. vector<string> split(const string& s, char c) {
  46. vector<string> v;
  47. stringstream ss(s);
  48. string x;
  49. while (getline(ss, x, c))
  50. v.emplace_back(x);
  51. return move(v);
  52. }
  53.  
  54. void err(vector<string>::iterator it) {}
  55. template<typename T, typename... Args>
  56. void err(vector<string>::iterator it, T a, Args... args) {
  57. cerr << it -> substr((*it)[0] == ' ', it -> length()) << " = " << a << " ";
  58. err(++it, args...);
  59. }
  60.  
  61.  
  62.  
  63. #define dbg(x) cout<<#x<<" : "<<x<<endl
  64. /// eeerrrrooooooorrrrrrr //////////////////
  65.  
  66. template <class T> inline T bigmod(T p,T e,T M){LL ret = 1;for(; e > 0; e >>= 1){if(e & 1) ret = (ret * p) % M;p = (p * p) % M;}return (T)ret;}
  67. template <class T> inline T gcd(T a,T b){if(b==0)return a;return gcd(b,a%b);}
  68. template <class T> inline T modinverse(T a,T M){return bigmod(a,M-2,M);} // M is prime}
  69. template <class T> inline T bpow(T p,T e){LL ret = 1;for(; e > 0; e >>= 1){if(e & 1) ret = (ret * p);p = (p * p);}return (T)ret;}
  70.  
  71. /// ///////////////////////////////////////////////////////////////////////////////////////////////////////////
  72. /// Let's do it ///
  73. /// Let's try it ///
  74. /// ///////////////////////////////////////////////////////////////////////////////////////////////////////////
  75.  
  76.  
  77. int const _n=2e5 + 9;
  78.  
  79. char dir[_n];
  80.  
  81. struct it
  82. {
  83. int isfor=0,isbak=0;;
  84. it(){
  85. isfor=0,isbak=0;
  86. }
  87.  
  88. };
  89. it tree[4*_n];int n,m;
  90.  
  91. void init(int l,int r,int node){
  92. if(l<0 || r>=n) return ;
  93. if(l==r){
  94. tree[node].isbak+= dir[l]=='<';
  95. tree[node].isfor+= dir[l]=='>';
  96. // error(tree[node].isfor,tree[node].isbak,node);
  97.  
  98. return;
  99. }
  100. int left=node<<1;
  101. int r8=left+1;
  102. int mid=(l+r)>>1;
  103. init(l,mid,left);
  104. init(mid+1,r,r8);
  105. tree[node].isfor=tree[left].isfor+tree[r8].isfor;
  106. tree[node].isbak=tree[left].isbak+tree[r8].isbak;
  107.  
  108. }
  109.  
  110. it query(int strt,int end,int l,int r,int node){
  111. if(l<=strt && r>=end) return tree[node];
  112. if(r<strt || l>end ) {
  113. it p;
  114. return p;
  115. }
  116. int mid=(strt+end)>>2;
  117. int left = node<<1;
  118. int r8 =left+1;
  119. it p1=query(strt,mid,l,r,left);
  120. it p2=query(mid+1,end,l,r,r8);
  121. it q;
  122. q.isfor=tree[left].isfor+tree[r8].isfor;
  123. q.isbak=tree[left].isbak+tree[r8].isbak;
  124. return q;
  125. }
  126. void updateRange(int strt,int end,int l,int r,int node){
  127. if(r<strt || l>end ||strt>end) return ;
  128. if(l<=strt && r>=end) {
  129. swap( tree[node].isfor,tree[node].isbak);
  130. return;
  131. }
  132. // dbg(node);
  133.  
  134. int mid=(strt+end)>>1;
  135. int left = node*2;
  136. int r8 =left+1;
  137. updateRange(strt,mid,l,r,left);
  138. updateRange(mid+1,end,l,r,r8);
  139.  
  140. tree[node].isfor=tree[left].isfor+tree[r8].isfor;
  141. tree[node].isbak=tree[left].isbak+tree[r8].isbak;
  142.  
  143. return ;
  144. }
  145.  
  146.  
  147. int main()
  148. {
  149.  
  150.  
  151. freopen("in.txt","r",stdin); freopen("output.txt","w",stdout);
  152. /// main start
  153.  
  154. n=Int,m=Int;
  155. scanf("%s",dir+1);
  156. init(1,n-1,1);
  157. // cout<<En<<En<<En;
  158.  
  159. while(m--){
  160. int sin=Int;
  161. int l=Int;
  162. int r=Int;
  163. if(sin==2){
  164. if(l>r) cout<< query(1,n-1,r,l-1,1).isfor<<En;
  165. else cout<< query(1,n-1,l,r-1,1).isbak<<En;
  166.  
  167. }
  168. if(sin==1){
  169. updateRange(1,n-1,l,r-1,1);
  170. // cout<<En<<En<<En;
  171. }
  172. }
  173.  
  174.  
  175.  
  176.  
  177.  
  178. return 0;
  179. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement