Advertisement
Guest User

UVa 11402 - Ahoy, Pirates

a guest
Jul 4th, 2013
264
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.99 KB | None | 0 0
  1. //darkstallion's template
  2.  
  3. #include<iostream>
  4. #include<cstdio>
  5. #include<cstdlib>
  6. #include<cstring>
  7. #include<vector>
  8. #include<map>
  9. #include<list>
  10. #include<set>
  11. #include<stack>
  12. #include<queue>
  13. #include<algorithm>
  14. #include<cmath>
  15. #include<string>
  16. #define fi first
  17. #define se second
  18. #define mp make_pair
  19. #define pb push_back
  20. #define popb pop_back
  21. #define del erase
  22. #define sz size
  23. #define ins insert
  24. #define FOR(a,b,c) for(int a = b; a < c; a++)
  25. #define FORS(a,b,c) for(int a = b; a <= c; a++)
  26. #define FORN(a,b) for(int a = 0; a < b; a++)
  27. #define FORD(a,b,c) for (int a = b; a >= c; a--)
  28. #define RES(a,b) memset(a,b,sizeof(a))
  29. #define LL long long
  30. #define PII pair<int,int>
  31. #define PLL pair<long long,long long>
  32. #define PDD pair<double,double>
  33. #define PCC pair<char,char>
  34. #define PSS pair<string,string>
  35. #define PI 3.1415926535897932384626433832795
  36. #define eps 1e-9
  37. using namespace std;
  38.  
  39. string s;
  40. int stree[1<<21], len[1<<21];
  41. char type[1<<21];
  42.  
  43. void st_build(int idx, int l, int r)
  44. {
  45.     if (l == r)
  46.         stree[idx] = (int)s[l]-'0';
  47.     else
  48.     {
  49.         st_build(idx*2+1, l, (l+r)/2);
  50.         st_build(idx*2+2, (l+r)/2+1, r);
  51.         stree[idx] = stree[idx*2+1] + stree[idx*2+2];
  52.     }
  53.     type[idx] = -1;
  54.     len[idx] = r-l+1;
  55. }
  56.  
  57. void setType(int idx, char c)
  58. {
  59.     if (c == 'I')
  60.     {
  61.         if (type[idx] == 'F')
  62.             type[idx] = 'E';
  63.         else if (type[idx] == 'E')
  64.             type[idx] = 'F';
  65.         else if (type[idx] == 'I')
  66.             type[idx] = -1;
  67.         else
  68.             type[idx] = 'I';
  69.     }
  70.     else
  71.         type[idx] = c;
  72. }
  73.  
  74. void st_change(int idx)
  75. {
  76.     if (type[idx] == 'F')
  77.         stree[idx] = len[idx];
  78.     else if (type[idx] == 'E')
  79.         stree[idx] = 0;
  80.     else if (type[idx] == 'I')
  81.         stree[idx] = len[idx]-stree[idx];
  82.     if ((type[idx] != -1) && (len[idx] > 1))
  83.     {
  84.         setType(idx*2+1,type[idx]);
  85.         setType(idx*2+2,type[idx]);
  86.         type[idx] = -1;
  87.     }
  88. }
  89.  
  90. void st_update(int idx, int l, int r, int i, int j, char c)
  91. {
  92.     if ((l >= i) && (r <= j))
  93.         setType(idx,c);
  94.     st_change(idx);
  95.     if ((l >= i) && (r <= j))
  96.         return;
  97.     if ((r < i) || (j < l))
  98.         return;
  99.     st_update(idx*2+1, l, (l+r)/2, i, j, c);
  100.     st_update(idx*2+2, (l+r)/2+1, r, i, j, c);
  101.     stree[idx] = stree[idx*2+1] + stree[idx*2+2];
  102. }
  103.  
  104. int st_query(int idx, int l, int r, int i, int j)
  105. {  
  106.     st_change(idx);
  107.     if ((r < i) || (j < l))
  108.         return 0;
  109.     if ((l >= i) && (r <= j))
  110.         return stree[idx];
  111.     int p1 = st_query(idx*2+1, l, (l+r)/2, i, j);
  112.     int p2 = st_query(idx*2+2, (l+r)/2+1, r, i, j);
  113.     stree[idx] = stree[idx*2+1] + stree[idx*2+2];
  114.     return p1+p2;
  115. }
  116.  
  117. int main()
  118. {
  119.     int t;
  120.     scanf("%d",&t);
  121.     FORN(i,t)
  122.     {
  123.         s = "";
  124.         int m;
  125.         scanf("%d",&m);
  126.         FORN(j,m)
  127.         {
  128.             int x;
  129.             string st;
  130.             scanf("%d",&x);
  131.             cin >> st;
  132.             FORN(k,x)
  133.                 s += st;
  134.         }
  135.         st_build(0,0,s.sz()-1);
  136.         printf("Case %d:\n",i+1);
  137.         int q,qno = 0;
  138.         scanf("%d",&q);
  139.         FORN(j,q)
  140.         {
  141.             char c;
  142.             int x,y;
  143.             getchar();
  144.             scanf("%c %d %d",&c,&x,&y);
  145.             if (c == 'S')
  146.             {
  147.                 qno++;
  148.                 printf("Q%d: %d\n",qno,st_query(0,0,s.sz()-1,x,y));
  149.             }
  150.             else
  151.                 st_update(0,0,s.sz()-1,x,y,c);
  152.         }
  153.     }
  154. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement