#include #define inf 1000000000 #define ll long long int using namespace std; vector seg1(1000000),seg2(1000000); vector lazy1(1000000),lazy2(1000000); int m; int n; void build(vector &seg, vector &lazy, int node, int b, int e) { if(b == e) { seg[node] = 0; lazy[node] = 0; return; } int m = (b+e)>>1; build(seg,lazy,2*node,b,m); build(seg,lazy,2*node+1,m+1,e); seg[node] = 0; lazy[node] = 0; } void update(vector &seg, vector &lazy, int node, int b, int e,int i, int j,int bal) { if(lazy[node]) { seg[node]+= lazy[node]; if(b!=e) { lazy[2*node]+= lazy[node]; lazy[2*node+1]+= lazy[node] ; } lazy[node] = 0; } if(b > j || e < i) return; if(b >= i && e <= j) { seg[node]+= bal; if(b!=e) { lazy[2*node]+= bal; lazy[2*node+1]+=bal; } //cout<<"i = "<>1; update(seg,lazy,2*node,b,m,i,j,bal); update(seg,lazy,2*node+1,m+1,e,i,j,bal); seg[node] = max(seg[2*node],seg[2*node+1]); //cout<<"i = "< &seg, vector &lazy, int node, int b, int e,int i, int j) { if(b > j || e < i) return 0; if(lazy[node]) { seg[node]+= lazy[node]; if(b!=e) { lazy[2*node]+=lazy[node]; lazy[2*node+1]+= lazy[node]; } lazy[node] = 0; } if(b >= i && e <= j) return seg[node]; int m = (b+e)>>1; return max(query(seg,lazy,2*node,b,m,i,j),query(seg,lazy,2*node+1,m+1,e,i,j)); } vector minimumZooNumbers(int m, int n, vector &t, vector &s, vector &d) { // Return a list of length n consisting of the answers multiset > v1,v2; for(int i = 0; i < n; i++) { if(s[i] >= d[i]) continue; if(t[i] == 'E' || t[i] == 'C') { v1.insert(make_pair(d[i]-1,s[i]-1)); } else { v2.insert(make_pair(d[i]-1,s[i]-1)); } } //cout<<"build start\n"; build(seg1,lazy1,1,0,m-1); build(seg2,lazy2,1,0,m-1); //cout<<"build end"<<"\n"; vector v(n,-1); int last = 0; vector ans(m,0); for(int i = 1; i < m; i++) { auto it = v1.lower_bound(make_pair(i,0)); //cout<<"v1 : \n"; while(it!=v1.end() && it->first == i) { //cout<<"it->second = "<second<<" i = "<second,1); ++it; } //cout<<"v2: \n"; it = v2.lower_bound(make_pair(i,0)); while(it!=v2.end() && it->first == i) { //cout<<"it->second = "<second<<" i = "<second,1); ++it; } ans[i] = max(query(seg1,lazy1,1,0,m-1,0,i),query(seg2,lazy2,1,0,m-1,0,i)); //cout<<"ans[i] = "<> cases; for(int a0 = 0; a0 < cases; a0++){ cin >> m >> n; vector t(n); for(int t_i = 0; t_i < n; t_i++){ cin >> t[t_i]; } vector s(n); for(int s_i = 0; s_i < n; s_i++){ cin >> s[s_i]; } vector d(n); for(int d_i = 0; d_i < n; d_i++){ cin >> d[d_i]; } vector result = minimumZooNumbers(m, n, t, s, d); for (ssize_t i = 0; i < result.size(); i++) { cout << result[i] << (i != result.size() - 1 ? " " : ""); } cout << endl; } return 0; }