#include using namespace std ; #define LL long long int #define ft first #define sd second #define PII pair #define MAXN 1000005 #define MAXM 10000001 #define mp make_pair #define f_in(st) freopen(st,"r",stdin) #define f_out(st) freopen(st,"w",stdout) #define sc(x) scanf("%d",&x) #define scll(x) scanf("%lld",&x) #define pr(x) printf("%d\n",x) #define prll(x) printf("%lld\n",x) ; #define pb push_back #define MOD 1000000007 #define MAX 1000010 #define ull long long #define prime 37 #define pb push_back #define ASST(x,y,z) assert(x >= y && x <= z) #define inf 11111111 int n , q , k , A[MAXN] ; vector > B , Q ; vector player , type ; vector less_ , equal_ , greater_ ; vector M ; vector S , E ; char ans[MAXN] ; int t ; LL nc2(int x){ return 1LL * x * (x+1) / 2 ; } int main(){ // f_in("in05.txt") ; // f_out("out05.txt") ; sc(n) ; sc(q) ; ASST(n,1,1000000) ; ASST(q,1,1000000) ; B.resize(n) ; Q.resize(q) ; M.resize(n+1) ; S.resize(n+2) ; E.resize(n+2) ; type.resize(q) ; player.resize(q) ; less_.resize(q) ; equal_.resize(q) ; greater_.resize(q) ; for(int i=1;i<=n;i++){ sc(A[i]) ; ASST(A[i],1,1000000000) ; B[i-1].ft = A[i] ; B[i-1].sd = i ; M[i] = true ; } for(int i=0;i> type[i] ; assert(type[i] == '>' || type[i] == '<' || type[i] == '=') ; sc(Q[i].ft); ASST(Q[i].ft,1,1000000000) ; cin >> player[i] ; assert(player[i] == 'D' || player[i] == 'C') ; Q[i].sd = i ; } sort(Q.begin(),Q.end()) ; // sort all queries according to the value of K sort(B.begin(),B.end()) ; int i , j , x ; LL less_than_equal_to = 0 ; for(int i=1;i<=n;i++){ M[i] = false ; S[i] = -1 ; E[i] = -1 ; } S[0] = E[0] = -1 ; S[n+1] = E[n+1] = -1 ; i = 0 ; j = 0 ; while(i < q){ x = Q[i].ft ; while(j < n && B[j].ft <= x){ M[B[j].sd] = true ; S[B[j].sd] = E[B[j].sd] = B[j].sd ; if(S[B[j].sd-1] != -1){ S[B[j].sd] = S[B[j].sd-1] ; } if(E[B[j].sd+1] != -1){ E[B[j].sd] = E[B[j].sd+1] ; } E[S[B[j].sd]] = E[B[j].sd] ; S[E[B[j].sd]] = S[B[j].sd] ; less_than_equal_to += (nc2(E[B[j].sd]-S[B[j].sd]+1) - nc2(E[B[j].sd]-B[j].sd) - nc2(B[j].sd-S[B[j].sd])) ; j ++ ; } equal_[Q[i].sd] = less_than_equal_to ; i ++ ; } for(int i=1;i<=n;i++){ M[i] = false ; S[i] = -1 ; E[i] = -1 ; } S[0] = E[0] = -1 ; S[n+1] = E[n+1] = -1 ; less_than_equal_to = 0 ; i = 0 ; j = 0 ; while(i < q){ x = Q[i].ft ; x -- ; while(j < n && B[j].ft <= x){ M[B[j].sd] = true ; S[B[j].sd] = E[B[j].sd] = B[j].sd ; if(S[B[j].sd-1] != -1){ S[B[j].sd] = S[B[j].sd-1] ; } if(E[B[j].sd+1] != -1){ E[B[j].sd] = E[B[j].sd+1] ; } E[S[B[j].sd]] = E[B[j].sd] ; S[E[B[j].sd]] = S[B[j].sd] ; less_than_equal_to += (nc2(E[B[j].sd]-S[B[j].sd]+1) - nc2(E[B[j].sd]-B[j].sd) - nc2(B[j].sd-S[B[j].sd])) ; j ++ ; } less_[Q[i].sd] = less_than_equal_to ; i ++ ; } LL total = nc2(n) ; for(int i=0;i' : ans[i] = ((player[i] == 'D') ? (greater_[i]%2 ? 'D' : 'C') : (greater_[i]%2 ? 'C' : 'D')) ; break ; case '=' : ans[i] = ((player[i] == 'D') ? (equal_[i]%2 ? 'D' : 'C') : (equal_[i]%2 ? 'C' : 'D')) ; ; break ; case '<' : ans[i] = ((player[i] == 'D') ? (less_[i]%2 ? 'D' : 'C') : (less_[i]%2 ? 'C' : 'D')) ; ; break ; } } ans[q] = 0 ; printf("%s\n",ans) ; return 0 ; }