#include using namespace std; long long F[500009][2]; int tree[2000009][2] = {0}; int lazy[2000009][2]= {0}; void updateRangeUtil(int si, int ss, int se, int us, int ue, int diff, int k) { if (lazy[si][k] != 0) { tree[si][k] += lazy[si][k]; if (ss != se) { lazy[si*2 + 1][k] += lazy[si][k]; lazy[si*2 + 2][k] += lazy[si][k]; } lazy[si][k] = 0; } if (ss>se || ss>ue || se=us && se<=ue) { tree[si][k] += diff; if (ss != se) { lazy[si*2 + 1][k] += diff; lazy[si*2 + 2][k] += diff; } return; } int mid = (ss+se)/2; updateRangeUtil(si*2+1, ss, mid, us, ue, diff,k); updateRangeUtil(si*2+2, mid+1, se, us, ue, diff,k); tree[si][k] =max( tree[si*2+1][k] , tree[si*2+2][k]); } void updateRange(int n, int us, int ue, int diff,int k) { n++;// us++; ue++; updateRangeUtil(0, 0, n, us, ue, diff,k);} int getSumUtil(int ss, int se, int qs, int qe, int si, int k) { if (lazy[si][k] != 0) { tree[si][k] += lazy[si][k]; if (ss != se) { lazy[si*2+1][k] += lazy[si][k]; lazy[si*2+2][k] += lazy[si][k]; } lazy[si][k] = 0; } if (ss>se || ss>qe || se=qs && se<=qe) return tree[si][k]; int mid = (ss + se)/2; return max(getSumUtil(ss, mid, qs, qe, 2*si+1,k) , getSumUtil(mid+1, se, qs, qe, 2*si+2,k)); } int getSum(int n, int qs, int qe, int k) { n++; //qs++; qe++; return getSumUtil(0, n, qs, qe, 0,k); } void upd (long long x, long long y,long long v, long long n) { while(x<=n) { F[x][y]+=v; x+=(x&-x); } } long long cnt(long long x, long long y) { long long ans=0; while(x>0) { ans=ans+=F[x][y]; x-=(x&-x); } return ans; } long long dp[500009],dp1[500009],D[500009]; void minimumZooNumbers(long long m, long long n, vector T, vector s, vector d) { vector,long long> > a; for (long long i=0; i<=m; i++) dp[i]=0,dp1[i]=0,D[i]=0,F[i][0]=0,F[i][1]=0; for (int i=0; i<=4*(m+40); i++) tree[i][0]=0,lazy[i][0]=0,tree[i][1]=0,lazy[i][1]=0; for (long long i=0; id[i]) continue; int c=dp[d[i]]; dp[d[i]]=max(dp[d[i]],cnt(d[i],T[i])+1+getSum(m+8,0,s[i],T[i])); // cout<> cases; // if(cases>1) cout<<1/0<> m >> n; vector t(n); vector T(n); for(long long t_i = 0; t_i < n; t_i++){ cin >> t[t_i]; if(t[t_i]=='D' || t[t_i]=='M') T[t_i]=1; else T[t_i]=0; } vector s(n); for(long long s_i = 0; s_i < n; s_i++){ cin >> s[s_i]; } vector d(n); for(long long d_i = 0; d_i < n; d_i++){ cin >> d[d_i]; } minimumZooNumbers(m, n, T, s, d); } return 0; }