Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //============================================================================
- // Name : ACM
- // Author : Tarango Khan
- // Team : BRACU Byteheads
- //============================================================================
- #include <bits/stdc++.h>
- using namespace std;
- #define Size 1000005
- struct num{
- long long val;
- long long high;
- long long low;
- num(long long a,long long b,long long c){
- val = a;
- high = b;
- low = c;
- }
- };
- bool cmp(num a,num b){
- if(a.val < b.val) return true;
- return false;
- }
- long long A[Size];
- long long Left[Size];
- long long Right[Size];
- map<long long,long long> Map;
- int N,M,Limit;
- vector<num> List;
- long long sub_sqnc[Size];
- int nxt[Size];
- void update_subarray_pos() {
- for (int i = 0; i < N; i++) {
- int l = i - 1, c = 0;
- while (l >= 0) {
- if (A[l] >= A[i])
- break;
- c++;
- l--;
- }
- Left[i] = c;
- int r = i + 1;
- c = 0;
- while (r < N) {
- if (A[r] > A[i])
- break;
- c++;
- r++;
- }
- Right[i] = c;
- }
- for (int i = 0; i < Size; i++) {
- nxt[i] = N;
- sub_sqnc[i] = 0;
- }
- int i = 1, st = 0;
- long long cnt = 1;
- while (i < N) {
- if (A[i] == A[i - 1]) {
- cnt++;
- } else {
- sub_sqnc[st] = cnt;
- nxt[st] = i;
- st = i;
- cnt = 1;
- }
- i++;
- }
- if (cnt >= 1) {
- sub_sqnc[st] = cnt;
- nxt[st] = i;
- }
- }
- void calc_sub_array() {
- update_subarray_pos();
- Map.clear();
- List.clear();
- int i = 0;
- while (i < N) {
- long long cnt = 0, lf, rt, same;
- long long v = A[i];
- if (sub_sqnc[i] > 1) {
- same = sub_sqnc[i];
- lf = Left[i];
- rt = Right[i] - (same - 1);
- cnt = (same * (same + 1)) / 2 + same * lf + same * rt + lf * rt;
- if (Map[v] == 0) {
- List.push_back(num(v, 0, 0));
- }
- Map[v] += cnt;
- i = nxt[i];
- } else {
- cnt = (Left[i] + 1) * (Right[i] + 1);
- if (Map[v] == 0) {
- List.push_back(num(v, 0, 0));
- }
- Map[v] += cnt;
- i++;
- }
- }
- Limit = List.size();
- sort(List.begin(), List.end(), cmp);
- long long sum = 0;
- for (int i = 0; i < Limit; i++) {
- List[i].low = sum;
- sum += Map[List[i].val];
- }
- sum = 0;
- for (int i = Limit - 1; i >= 0; i--) {
- List[i].high = sum;
- sum += Map[List[i].val];
- }
- /*
- for (int i = 0; i < Limit; i++) {
- printf("Val: %d , map: %d , higher: %d , lower: %d\n", List[i].val,
- Map[List[i].val], List[i].high, List[i].low);
- }
- */
- }
- long long b_search_greater(long long value){
- int L = 0,R = Limit-1,m;
- while(L <= R){
- m = (L+R)/2;
- if(L == R) break;
- if(List[m].val == value) break;
- if(List[m].val > value) R = m-1;
- else L = m+1;
- }
- if(L>0) L--;if(L>0) L--;
- while(L<Limit && List[L].val <= value) L++;
- if(L >= Limit) return 0;
- return (List[L].high + Map[List[L].val]);
- }
- long long b_search_smaller(long long value){
- int L = 0,R = Limit-1,m;
- while(L <= R){
- m = (L+R)/2;
- if(L == R) break;
- if(List[m].val == value) break;
- if(List[m].val > value) R = m-1;
- else L = m+1;
- }
- if(L >= Limit) L--;
- if(L<Limit-1) L++;if(L<Limit-1) L++;
- while(L>=0 && List[L].val >= value) L--;
- if(L < 0) return 0;
- return (List[L].low + Map[List[L].val]);
- }
- long long b_search_equal(long long value){
- int L = 0,R = Limit-1,m;
- while(L <= R){
- m = (L+R)/2;
- if(List[m].val == value){
- return Map[List[m].val];
- }
- if(L == R) break;
- if(List[m].val > value) R = m-1;
- else L = m+1;
- }
- return 0;
- }
- char typ,player;
- long long K;
- string get_result(long long ret) {
- if (ret % 2 == 0) {
- if (player == 'D') return "C";
- else return "D";
- }
- if (player == 'D') return "D";
- else return "C";
- }
- char Line[15];
- void take_input() {
- gets(Line);
- sscanf(Line, "%c %lld %c", &typ, &K, &player);
- }
- void take_case_line() {
- gets(Line);
- sscanf(Line, "%d %d", &N, &M);
- }
- int main() {
- take_case_line();
- for (int i = 0; i < N; i++) {
- scanf("%lld",&A[i]);
- }
- scanf("\n");
- calc_sub_array();
- for (int i = 0; i < M; i++) {
- take_input();
- long long ret;
- if (typ == '>') {
- ret = b_search_greater(K);
- } else if (typ == '<') {
- ret = b_search_smaller(K);
- } else {
- ret = b_search_equal(K);
- }
- cout << get_result(ret);
- }
- cout << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment