Wednesday, 26 July 2017

Lightoj 1087 Diablo (Seg tree)


  //it can be done using segment tree, sqrt decomposition and vector
  // Segment tree version
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define pi 2*acos(0.0)
  4. #define all(v) v.begin(),v.end()
  5. #define coff ios_base::sync_with_stdio(0);
  6. #define ff first
  7. #define se second
  8. #define pb push_back
  9. #define sz(a) ((int)a.size())
  10. #define ST(v) sort(all(v))
  11. #define gcd(a,b) __gcd(a,b)
  12. #define lcm(a,b) (a*(b/gcd(a,b)))
  13. #define max3(a,b,c) max(a,max(b,c))
  14. #define min3(a,b,c) min(a,min(b,c))
  15. #define cover(a,d) memset(a,d,sizeof(a))
  16. #define popcount(i) __builtin_popcount(i)      //count one. in long long use __builtin_popcountll(i)
  17. #define parity(i)   __builtin_parity(i)       //evenparity 0 and odd parity 1
  18. #define btz(a)   __builtin_ctz(a)            //count binary trailling zero
  19. #define un(v) ST(v), (v).erase(unique(all(v)),v.end())
  20. #define common(a,b) ST(a), ST(b), a.erase(set_intersection(all(a),all(b),a.begin()),a.end())
  21. #define uncommon(a,b) ST(a), ST(b), a.erase(set_symmetric_difference(all(a),all(b),a.begin()),a.end())
  22. typedef  long long ll;
  23. typedef  unsigned long long ull;
  24. template <typename T>string toString( T Number ){stringstream st;st << Number;return st.str();}
  25. int stringconvert(string s){int p; istringstream st(s); st>>; return p;}
  26. //upper bound and lower bound
  27. #define LB(a,value) (lower_bound(all(a),value)-a.begin())
  28. #define UB(a,value) (upper_bound(all(a),value)-a.begin())
  29. //Debug
  30. #define dbg(x) cout<<#x<<'='<<x<<endl;
  31. #define dbgarr(i,a) cout<<#a<<"["<<i<<"] = "<<a[i]<<" "<<endl;
  32. #define nl puts("")
  33. //File input/output
  34. #define input freopen("in.txt","r",stdin)
  35. #define output freopen("out.txt","w",stdout)
  36. ll bigmod(ll a,ll b, ll m) { ll res = 1; while(b) { if(& 1) { res = ( (res % m) * (% m) ) %; } a= ((a%m) * (a%m)) %m; b >>= 1; }return res; }
  37. ll modInverse(ll a, ll m){return bigmod(a,m-2,m);}
  38. ////============ CONSTANT ===============////
  39. #define inf   1<<30                                           //infinity value
  40. #define eps   1e-9
  41. #define mx    100009
  42. #define mod   1000000007
  43. ////=====================================////
  44. struct info //for combine single update segment tree and range update segment tree
  45. {
  46.     int sum,value,pos;
  47.     info() : sum(0),value(0),pos(0){}
  48. }tree[6*mx];
  49. int limit;
  50. void update_node(int node, int i, int val,int visibility)
  51. {
  52.     tree[node].pos = i;
  53.     tree[node].value = val;
  54.     tree[node].sum = visibility;
  55. }
  56. void marge(int node, int left, int right)
  57. {
  58.     tree[node].sum= tree[left].sum + tree[right].sum;
  59. }
  60. void update(int node, int s, int e, int i, int val, int status)
  61. {
  62.    if(s==e)
  63.    {
  64.        update_node(node,i,val,status);
  65.        return;
  66.    }
  67.    int left=node<<1;
  68.    int mid=(s+e)>>1;
  69.    if(i<=mid)
  70.    {
  71.         update(left,s,mid,i,val,status);
  72.    }
  73.    else
  74.    {
  75.        update(left+1,mid+1,e,i,val,status);
  76.    }
  77.    marge(node,left,left+1);
  78. }
  79. int query(int node, int s, int e, int k)
  80. {
  81.     if(k>tree[node].sum)
  82.     {
  83.         return -1;
  84.     }
  85.     if(s==e)
  86.     {
  87.         if(k!=tree[node].sum)
  88.             return -1;
  89.         else
  90.         {
  91.             tree[node].sum=0;
  92.             update(1,1,limit,tree[node].pos,tree[node].value,0);
  93.             return tree[node].value;
  94.         }
  95.     }
  96.     int left=node<<1;
  97.     int mid=(s+e)>>1;
  98.     if(k<=tree[left].sum)
  99.     {
  100.         return query(left,s,mid,k);
  101.     }
  102.     else
  103.     {
  104.         return query(left+1,mid+1,e,k-tree[left].sum);
  105.     }
  106. }
  107. int main()
  108. {
  109.     int t,no=0;
  110.     scanf("%d",&t);
  111.     while(t--)
  112.     {
  113.         int n,q,a;
  114.         scanf("%d %d",&n,&q);
  115.         cover(tree,0);
  116.         limit=n+q; // because of initialize segment tree node may not equal after query updating but this is highest limit of each input.
  117.         for(int i=0;i<n;i++)
  118.         {
  119.             scanf("%d",&a);
  120.             update(1,1,limit,i+1,a,1);
  121.         }
  122.         printf("Case %d:n",++no);
  123.         while(q--)
  124.         {
  125.             char ch[3];
  126.             scanf("%s %d",&ch,&a);
  127.             if(ch[0]=='a')
  128.             {
  129.                 n++;
  130.                 update(1,1,limit,n,a,1);
  131.             }
  132.             else
  133.             {
  134.                 int res = query(1,1,limit,a);
  135.                 if(res==-1)
  136.                 {
  137.                     printf("nonen");
  138.                 }
  139.                 else
  140.                 {
  141.                     printf("%dn",res);
  142.                 }
  143.             }
  144.         }
  145.     }
  146.     return 0;
  147. }

No comments:

Post a Comment

Most Featured Post

Lightoj 1159 - Batman

http://lightoj.com/volume_showproblem.php?problem=1159 problem analysis: First i thought of this as if s1, s2 and s3 are those three str...