#include #define mp make_pair #define fi first #define se second using namespace std; int n,m,t,ind1,ind2; int BIT_P1[4][50010],BIT_P2[4][50010]; vector p1,p2; pair< char, pair > a[50010]; map< char,int > e; bool cmp(pair< char, pair > e1,pair< char, pair > e2) { if(e1.se.se != e2.se.se) return e1.se.se < e2.se.se; return e1.se.fi > e2.se.fi; } void insert1(pair< char, pair > an) { p1[ind1++] = an.se.se; int posi = an.se.fi,fin =an.se.se-1; for(int k = an.se.fi; k<=an.se.se-1; k++) { posi = k; while(posi<=n) { BIT_P1[e[an.fi]][posi]++; posi+=(posi&-posi); } } return; } void insert2(pair< char, pair > an) { p2[ind2++] = an.se.se; int posi = an.se.fi,fin =an.se.se-1; for(int k = an.se.fi; k<=an.se.se-1; k++) { posi = k; while(posi<=n) { BIT_P2[e[an.fi]][posi]++; posi+=(posi&-posi); } } return; } void query1(pair< char, pair > an) { int dog = 0,cat = 0, ele = 0, ms = 0; int ini,fin; ini = an.se.fi-1; fin = an.se.se-1; while(fin>0) { dog+=BIT_P1[e['D']][fin]; fin-=(fin&-fin); } while(ini>0) { dog-=BIT_P1[e['D']][ini]; ini-=(ini&-ini); } ini = an.se.fi-1; fin = an.se.se-1; while(fin>0) { cat+=BIT_P1[e['C']][fin]; fin-=(fin&-fin); } while(ini>0) { cat-=BIT_P1[e['C']][ini]; ini-=(ini&-ini); } ini = an.se.fi-1; fin = an.se.se-1; while(fin>0) { ele+=BIT_P1[e['E']][fin]; fin-=(fin&-fin); } while(ini>0) { ele-=BIT_P1[e['E']][ini]; ini-=(ini&-ini); } ini = an.se.fi-1; fin = an.se.se-1; while(fin>0) { ms+=BIT_P1[e['M']][fin]; fin-=(fin&-fin); } while(ini>0) { ms-=BIT_P1[e['M']][ini]; ini-=(ini&-ini); } if(an.fi == 'D' && cat+ele==0) insert1(an); if(an.fi == 'C' && dog+ms==0) insert1(an); if(an.fi == 'M' && cat+ele == 0) insert1(an); if(an.fi == 'E' && dog+ms == 0) insert1(an); return; } void query2(pair< char, pair > an) { int dog = 0,cat = 0, ele = 0, ms = 0; int ini,fin; ini = an.se.fi-1; fin = an.se.se-1; while(fin>0) { dog+=BIT_P2[e['D']][fin]; fin-=(fin&-fin); } while(ini>0) { dog-=BIT_P2[e['D']][ini]; ini-=(ini&-ini); } ini = an.se.fi-1; fin = an.se.se-1; while(fin>0) { cat+=BIT_P2[e['C']][fin]; fin-=(fin&-fin); } while(ini>0) { cat-=BIT_P2[e['C']][ini]; ini-=(ini&-ini); } ini = an.se.fi-1; fin = an.se.se-1; while(fin>0) { ele+=BIT_P2[e['E']][fin]; fin-=(fin&-fin); } while(ini>0) { ele-=BIT_P2[e['E']][ini]; ini-=(ini&-ini); } ini = an.se.fi-1; fin = an.se.se-1; while(fin>0) { ms+=BIT_P2[e['M']][fin]; fin-=(fin&-fin); } while(ini>0) { ms-=BIT_P2[e['M']][ini]; ini-=(ini&-ini); } if(an.fi == 'D' && cat+ele==0) insert2(an); if(an.fi == 'C' && dog+ms==0) insert2(an); if(an.fi == 'M' && cat+ele == 0) insert2(an); if(an.fi == 'E' && dog+ms == 0) insert2(an); return; } int main() { ios::sync_with_stdio(false); cin >> t; e['D'] = 0; e['C'] = 1; e['M'] = 2; e['E'] = 3; while(t--) { ind1 = ind2 = 0; p1.clear(); p2.clear(); for(int i=0; i<4; i++) for(int j=0; j<=50001; j++) BIT_P1[i][j] = BIT_P2[i][j] = 0; cin >> m >> n; p1.resize(n); p2.resize(n); for(int i=0; i> a[i].fi; for(int i=0; i> a[i].se.fi; for(int i=0; i> a[i].se.se; sort(a,a+n,cmp); insert1(a[0]); for(int i=1; i