#include #include #include #include #include using namespace std; vector akhir[50005][2]; int segtree[2][400005], leftover[2][400005], awal[50005], tuju[50005], jawab[50005]; int NT, N, M, best[50005]; char tipe[50005][3]; void increase(int nomor, int value, int kiri, int kanan, int left, int right, int node) { if (left == kiri && kanan == right) { leftover[nomor][node] += value; segtree[nomor][node] += value; } else { int mid = (left + right) / 2; increase(nomor, leftover[nomor][node], left, mid, left, mid, 2*node); increase(nomor, leftover[nomor][node], mid+1, right, mid+1, right, 2*node+1); leftover[nomor][node] = 0; if (kiri <= mid) increase(nomor, value, kiri, min(kanan, mid), left, mid, 2*node); if (kanan > mid) increase(nomor, value, max(kiri, mid+1), kanan, mid+1, right, 2*node+1); segtree[nomor][node] = max(segtree[nomor][2*node], segtree[nomor][2*node+1]); } } void set_value(int nomor, int idx, int value, int left, int right, int node) { if (left == right) { segtree[nomor][node] = value; } else { int mid = (left + right) / 2; increase(nomor, leftover[nomor][node], left, mid, left, mid, 2*node); increase(nomor, leftover[nomor][node], mid+1, right, mid+1, right, 2*node+1); leftover[nomor][node] = 0; if (idx <= mid) set_value(nomor, idx, value, left, mid, 2*node); else set_value(nomor, idx, value, mid+1, right, 2*node+1); segtree[nomor][node] = max(segtree[nomor][2*node], segtree[nomor][2*node+1]); } } int main() { scanf("%d",&NT); for (int t=0;t tuju[i]) continue; if (tipe[i][0] == 'C' || tipe[i][0] == 'E') akhir[tuju[i]][0].push_back(awal[i]); else akhir[tuju[i]][1].push_back(awal[i]); } memset(best,0,sizeof(best)); memset(segtree,0,sizeof(segtree)); memset(leftover,0,sizeof(leftover)); best[0] = 0; for (int i=1;i<=M;++i) { sort(akhir[i][0].begin(), akhir[i][0].end()); sort(akhir[i][1].begin(), akhir[i][1].end()); for (int j=akhir[i][0].size()-1;j>-1;--j) { increase(0,1,1,akhir[i][0][j],1,M,1); } for (int j=akhir[i][1].size()-1;j>-1;--j) { increase(1,1,1,akhir[i][1][j],1,M,1); } best[i] = max(best[i-1],max(segtree[0][1], segtree[1][1])); set_value(0,i,best[i],1,M,1); set_value(1,i,best[i],1,M,1); //printf("%d : %d\n",i,best[i]); } int last = 0; for (int i=1;i<=M;++i) { if (best[i] > best[i-1]) { for (int j=last+1;j<=best[i];++j) jawab[j] = i; last = best[i]; } } for (int j=last+1;j<=N;++j) jawab[j] = -1; for (int i=1;i