Tarango

Untitled

Aug 11th, 2015
349
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.16 KB | None | 0 0
  1. //============================================================================
  2. // Name        : ACM
  3. // Author      : Tarango Khan
  4. // Team        : BRACU Byteheads
  5. //============================================================================
  6.  
  7. #include <bits/stdc++.h>
  8. using namespace std;
  9. #define Size 1000005
  10.  
  11. struct num{
  12.     long long val;
  13.     long long high;
  14.     long long low;
  15.     num(long long a,long long b,long long c){
  16.         val = a;
  17.         high = b;
  18.         low = c;
  19.     }
  20. };
  21.  
  22. bool cmp(num a,num b){
  23.     if(a.val < b.val) return true;
  24.     return false;
  25. }
  26.  
  27. long long A[Size];
  28. long long Left[Size];
  29. long long Right[Size];
  30. map<long long,long long> Map;
  31. int N,M,Limit;
  32. vector<num> List;
  33.  
  34. long long sub_sqnc[Size];
  35. int nxt[Size];
  36.  
  37. void update_subarray_pos() {
  38.     for (int i = 0; i < N; i++) {
  39.         int l = i - 1, c = 0;
  40.         while (l >= 0) {
  41.             if (A[l] >= A[i])
  42.                 break;
  43.             c++;
  44.             l--;
  45.         }
  46.         Left[i] = c;
  47.         int r = i + 1;
  48.         c = 0;
  49.         while (r < N) {
  50.             if (A[r] > A[i])
  51.                 break;
  52.             c++;
  53.             r++;
  54.         }
  55.         Right[i] = c;
  56.     }
  57.     for (int i = 0; i < Size; i++) {
  58.         nxt[i] = N;
  59.         sub_sqnc[i] = 0;
  60.     }
  61.  
  62.     int i = 1, st = 0;
  63.     long long cnt = 1;
  64.     while (i < N) {
  65.         if (A[i] == A[i - 1]) {
  66.             cnt++;
  67.         } else {
  68.             sub_sqnc[st] = cnt;
  69.             nxt[st] = i;
  70.             st = i;
  71.             cnt = 1;
  72.         }
  73.         i++;
  74.     }
  75.     if (cnt >= 1) {
  76.         sub_sqnc[st] = cnt;
  77.         nxt[st] = i;
  78.     }
  79. }
  80.  
  81. void calc_sub_array() {
  82.     update_subarray_pos();
  83.     Map.clear();
  84.     List.clear();
  85.     int i = 0;
  86.     while (i < N) {
  87.         long long cnt = 0, lf, rt, same;
  88.         long long v = A[i];
  89.         if (sub_sqnc[i] > 1) {
  90.             same = sub_sqnc[i];
  91.             lf = Left[i];
  92.             rt = Right[i] - (same - 1);
  93.             cnt = (same * (same + 1)) / 2 + same * lf + same * rt + lf * rt;
  94.             if (Map[v] == 0) {
  95.                 List.push_back(num(v, 0, 0));
  96.             }
  97.             Map[v] += cnt;
  98.             i = nxt[i];
  99.         } else {
  100.             cnt = (Left[i] + 1) * (Right[i] + 1);
  101.             if (Map[v] == 0) {
  102.                 List.push_back(num(v, 0, 0));
  103.             }
  104.             Map[v] += cnt;
  105.             i++;
  106.         }
  107.     }
  108.     Limit = List.size();
  109.     sort(List.begin(), List.end(), cmp);
  110.  
  111.     long long sum = 0;
  112.     for (int i = 0; i < Limit; i++) {
  113.         List[i].low = sum;
  114.         sum += Map[List[i].val];
  115.     }
  116.     sum = 0;
  117.     for (int i = Limit - 1; i >= 0; i--) {
  118.         List[i].high = sum;
  119.         sum += Map[List[i].val];
  120.     }
  121.     /*
  122.     for (int i = 0; i < Limit; i++) {
  123.         printf("Val: %d , map: %d , higher: %d , lower: %d\n", List[i].val,
  124.                 Map[List[i].val], List[i].high, List[i].low);
  125.     }
  126.     */
  127. }
  128.  
  129. long long b_search_greater(long long value){
  130.     int L = 0,R = Limit-1,m;
  131.     while(L <= R){
  132.         m = (L+R)/2;
  133.         if(L == R) break;
  134.         if(List[m].val == value) break;
  135.         if(List[m].val > value) R = m-1;
  136.         else L = m+1;
  137.     }
  138.     if(L>0) L--;if(L>0) L--;
  139.     while(L<Limit && List[L].val <= value) L++;
  140.     if(L >= Limit) return 0;
  141.     return (List[L].high + Map[List[L].val]);
  142. }
  143.  
  144. long long b_search_smaller(long long value){
  145.     int L = 0,R = Limit-1,m;
  146.     while(L <= R){
  147.         m = (L+R)/2;
  148.         if(L == R) break;
  149.         if(List[m].val == value) break;
  150.         if(List[m].val > value) R = m-1;
  151.         else L = m+1;
  152.     }
  153.     if(L >= Limit) L--;
  154.     if(L<Limit-1) L++;if(L<Limit-1) L++;
  155.     while(L>=0 && List[L].val >= value) L--;
  156.     if(L < 0) return 0;
  157.     return (List[L].low + Map[List[L].val]);
  158. }
  159.  
  160. long long b_search_equal(long long value){
  161.     int L = 0,R = Limit-1,m;
  162.     while(L <= R){
  163.         m = (L+R)/2;
  164.         if(List[m].val == value){
  165.             return Map[List[m].val];
  166.         }
  167.         if(L == R) break;
  168.         if(List[m].val > value) R = m-1;
  169.         else L = m+1;
  170.     }
  171.     return 0;
  172. }
  173.  
  174. char typ,player;
  175. long long K;
  176.  
  177. string get_result(long long ret) {
  178.     if (ret % 2 == 0) {
  179.         if (player == 'D') return "C";
  180.         else return "D";
  181.     }
  182.     if (player == 'D') return "D";
  183.     else return "C";
  184. }
  185.  
  186. char Line[15];
  187.  
  188. void take_input() {
  189.     gets(Line);
  190.     sscanf(Line, "%c %lld %c", &typ, &K, &player);
  191. }
  192.  
  193. void take_case_line() {
  194.     gets(Line);
  195.     sscanf(Line, "%d %d", &N, &M);
  196. }
  197.  
  198. int main() {
  199.     take_case_line();
  200.     for (int i = 0; i < N; i++) {
  201.         scanf("%lld",&A[i]);
  202.     }
  203.     scanf("\n");
  204.     calc_sub_array();
  205.     for (int i = 0; i < M; i++) {
  206.         take_input();
  207.         long long ret;
  208.         if (typ == '>') {
  209.             ret = b_search_greater(K);
  210.         } else if (typ == '<') {
  211.             ret = b_search_smaller(K);
  212.         } else {
  213.             ret = b_search_equal(K);
  214.         }
  215.         cout << get_result(ret);
  216.     }
  217.     cout << endl;
  218.     return 0;
  219. }
Advertisement
Add Comment
Please, Sign In to add comment