#include using namespace std; #define MOD 1000000000 #define INF 1e18 #define pb push_back #define F first #define S second #define ll long long #define pi pair #define sc(x) scanf("%lld",&x) ll type[50010]; ll source[50010]; vector dest1[50010]; vector dest2[50010]; ll ans[50010]; vector tree1[200010]; vector tree2[200010]; void build_tree(ll node, ll a, ll b) { if(a > b) return; if(a == b) { for(ll i:dest1[a]){ tree1[node].push_back(i); } for(ll i:dest2[a]){ tree2[node].push_back(i); } return; } build_tree(node*2, a, (a+b)/2); build_tree(node*2+1, 1+(a+b)/2, b); tree1[node].resize(tree1[node*2].size()+tree1[node*2+1].size()); tree2[node].resize(tree2[node*2].size()+tree2[node*2+1].size()); merge(tree1[node*2].begin(),tree1[node*2].end(),tree1[node*2+1].begin(),tree1[node*2+1].end(),tree1[node].begin()); merge(tree2[node*2].begin(),tree2[node*2].end(),tree2[node*2+1].begin(),tree2[node*2+1].end(),tree2[node].begin()); // cout<<"node "< query_tree(ll node, ll a, ll b, ll i, ll j) { if(a > b || a > j || b < i) return {0,0}; if(a >= i && b <= j){ ll cnt1=lower_bound(tree1[node].begin(),tree1[node].end(),i)-tree1[node].begin(); ll cnt2=lower_bound(tree2[node].begin(),tree2[node].end(),i)-tree2[node].begin(); // cout<>c; if(c=='E'){ type[i]=0; } else if(c=='D'){ type[i]=1; } else if(c=='C'){ type[i]=0; } else{ type[i]=1; } } for(int i=0;i=curr){ cout<