#include <bits/stdc++.h>
using namespace std;
struct Node {
int len, cnt;
int pref, lp; // prefix bits + length
int suff, ls; // suffix bits + length
bool lazy;
Node(): len(0), cnt(0), pref(0), lp(0), suff(0), ls(0), lazy(false) {}
};
int N;
string S;
vector<Node> seg;
inline bool is_fish3(int a, int b, int c) {
// a,b,c are bits (0=<,1=>)
return (a==1 && b==0 && c==1) || (a==0 && b==1 && c==0);
}
Node merge_node(const Node &L, const Node &R) {
if(L.len==0) return R;
if(R.len==0) return L;
Node res;
res.len = L.len + R.len;
res.cnt = L.cnt + R.cnt;
// 경계 패턴 확인
vector<int> mid;
for(int i = 0; i < L.ls; i++) mid.push_back((L.suff >> (L.ls-1-i)) & 1);
for(int i = 0; i < R.lp; i++) mid.push_back((R.pref >> (R.lp-1-i)) & 1);
for(int i = 0; i + 2 < (int)mid.size(); i++) {
if(is_fish3(mid[i], mid[i+1], mid[i+2])) res.cnt++;
}
// prefix
if(L.lp == 2) {
res.pref = L.pref;
res.lp = 2;
} else {
res.lp = min(L.lp + R.lp, 2);
int val = (L.pref << R.lp) | R.pref;
if(res.lp==2) val &= 3;
res.pref = val;
}
// suffix
if(R.ls == 2) {
res.suff = R.suff;
res.ls = 2;
} else {
res.ls = min(L.ls + R.ls, 2);
int val = (L.suff << R.ls) | R.suff;
if(res.ls==2) val &= 3;
res.suff = val;
}
res.lazy = false;
return res;
}
inline void apply_flip(Node &v) {
if(v.len==0) return;
auto flipbits=[&](int bits,int len)->int{
int r=0;
for(int i=0;i<len;i++){
int b=(bits>>(len-1-i))&1;
r=(r<<1)|(b^1);
}
return r;
};
v.pref = flipbits(v.pref,v.lp);
v.suff = flipbits(v.suff,v.ls);
v.lazy = !v.lazy;
}
void push(int idx){
if(seg[idx].lazy){
apply_flip(seg[idx<<1]);
apply_flip(seg[idx<<1|1]);
seg[idx].lazy=false;
}
}
void build(int idx,int l,int r){
if(l==r){
seg[idx].len=1;
seg[idx].cnt=0;
int b = (S[l]=='>');
seg[idx].pref=b; seg[idx].lp=1;
seg[idx].suff=b; seg[idx].ls=1;
seg[idx].lazy=false;
return;
}
int m=(l+r)>>1;
build(idx<<1,l,m);
build(idx<<1|1,m+1,r);
seg[idx]=merge_node(seg[idx<<1],seg[idx<<1|1]);
}
void update(int idx,int l,int r,int ql,int qr){
if(ql>r||qr<l) return;
if(ql<=l&&r<=qr){
apply_flip(seg[idx]);
return;
}
push(idx);
int m=(l+r)>>1;
update(idx<<1,l,m,ql,qr);
update(idx<<1|1,m+1,r,ql,qr);
seg[idx]=merge_node(seg[idx<<1],seg[idx<<1|1]);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>N;
cin>>S;
int Q; cin>>Q;
seg.assign(4*N+5,Node());
build(1,0,N-1);
while(Q--){
int t; cin>>t;
if(t==1){
int l,r; cin>>l>>r;
--l; --r;
update(1,0,N-1,l,r);
}else{
cout<<seg[1].cnt<<"\n";
}
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgTm9kZSB7CiAgICBpbnQgbGVuLCBjbnQ7CiAgICBpbnQgcHJlZiwgbHA7IC8vIHByZWZpeCBiaXRzICsgbGVuZ3RoCiAgICBpbnQgc3VmZiwgbHM7IC8vIHN1ZmZpeCBiaXRzICsgbGVuZ3RoCiAgICBib29sIGxhenk7CiAgICBOb2RlKCk6IGxlbigwKSwgY250KDApLCBwcmVmKDApLCBscCgwKSwgc3VmZigwKSwgbHMoMCksIGxhenkoZmFsc2UpIHt9Cn07CgppbnQgTjsKc3RyaW5nIFM7CnZlY3RvcjxOb2RlPiBzZWc7CgppbmxpbmUgYm9vbCBpc19maXNoMyhpbnQgYSwgaW50IGIsIGludCBjKSB7CiAgICAvLyBhLGIsYyBhcmUgYml0cyAoMD08LDE9PikKICAgIHJldHVybiAoYT09MSAmJiBiPT0wICYmIGM9PTEpIHx8IChhPT0wICYmIGI9PTEgJiYgYz09MCk7Cn0KCk5vZGUgbWVyZ2Vfbm9kZShjb25zdCBOb2RlICZMLCBjb25zdCBOb2RlICZSKSB7CiAgICBpZihMLmxlbj09MCkgcmV0dXJuIFI7CiAgICBpZihSLmxlbj09MCkgcmV0dXJuIEw7CiAgICBOb2RlIHJlczsKICAgIHJlcy5sZW4gPSBMLmxlbiArIFIubGVuOwogICAgcmVzLmNudCA9IEwuY250ICsgUi5jbnQ7CgogICAgLy8g6rK96rOEIO2MqO2EtCDtmZXsnbgKICAgIHZlY3RvcjxpbnQ+IG1pZDsKICAgIGZvcihpbnQgaSA9IDA7IGkgPCBMLmxzOyBpKyspIG1pZC5wdXNoX2JhY2soKEwuc3VmZiA+PiAoTC5scy0xLWkpKSAmIDEpOwogICAgZm9yKGludCBpID0gMDsgaSA8IFIubHA7IGkrKykgbWlkLnB1c2hfYmFjaygoUi5wcmVmID4+IChSLmxwLTEtaSkpICYgMSk7CiAgICBmb3IoaW50IGkgPSAwOyBpICsgMiA8IChpbnQpbWlkLnNpemUoKTsgaSsrKSB7CiAgICAgICAgaWYoaXNfZmlzaDMobWlkW2ldLCBtaWRbaSsxXSwgbWlkW2krMl0pKSByZXMuY250Kys7CiAgICB9CgogICAgLy8gcHJlZml4CiAgICBpZihMLmxwID09IDIpIHsKICAgICAgICByZXMucHJlZiA9IEwucHJlZjsKICAgICAgICByZXMubHAgPSAyOwogICAgfSBlbHNlIHsKICAgICAgICByZXMubHAgPSBtaW4oTC5scCArIFIubHAsIDIpOwogICAgICAgIGludCB2YWwgPSAoTC5wcmVmIDw8IFIubHApIHwgUi5wcmVmOwogICAgICAgIGlmKHJlcy5scD09MikgdmFsICY9IDM7CiAgICAgICAgcmVzLnByZWYgPSB2YWw7CiAgICB9CgogICAgLy8gc3VmZml4CiAgICBpZihSLmxzID09IDIpIHsKICAgICAgICByZXMuc3VmZiA9IFIuc3VmZjsKICAgICAgICByZXMubHMgPSAyOwogICAgfSBlbHNlIHsKICAgICAgICByZXMubHMgPSBtaW4oTC5scyArIFIubHMsIDIpOwogICAgICAgIGludCB2YWwgPSAoTC5zdWZmIDw8IFIubHMpIHwgUi5zdWZmOwogICAgICAgIGlmKHJlcy5scz09MikgdmFsICY9IDM7CiAgICAgICAgcmVzLnN1ZmYgPSB2YWw7CiAgICB9CgogICAgcmVzLmxhenkgPSBmYWxzZTsKICAgIHJldHVybiByZXM7Cn0KCmlubGluZSB2b2lkIGFwcGx5X2ZsaXAoTm9kZSAmdikgewogICAgaWYodi5sZW49PTApIHJldHVybjsKICAgIGF1dG8gZmxpcGJpdHM9WyZdKGludCBiaXRzLGludCBsZW4pLT5pbnR7CiAgICAgICAgaW50IHI9MDsKICAgICAgICBmb3IoaW50IGk9MDtpPGxlbjtpKyspewogICAgICAgICAgICBpbnQgYj0oYml0cz4+KGxlbi0xLWkpKSYxOwogICAgICAgICAgICByPShyPDwxKXwoYl4xKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHI7CiAgICB9OwogICAgdi5wcmVmID0gZmxpcGJpdHModi5wcmVmLHYubHApOwogICAgdi5zdWZmID0gZmxpcGJpdHModi5zdWZmLHYubHMpOwogICAgdi5sYXp5ID0gIXYubGF6eTsKfQoKdm9pZCBwdXNoKGludCBpZHgpewogICAgaWYoc2VnW2lkeF0ubGF6eSl7CiAgICAgICAgYXBwbHlfZmxpcChzZWdbaWR4PDwxXSk7CiAgICAgICAgYXBwbHlfZmxpcChzZWdbaWR4PDwxfDFdKTsKICAgICAgICBzZWdbaWR4XS5sYXp5PWZhbHNlOwogICAgfQp9Cgp2b2lkIGJ1aWxkKGludCBpZHgsaW50IGwsaW50IHIpewogICAgaWYobD09cil7CiAgICAgICAgc2VnW2lkeF0ubGVuPTE7CiAgICAgICAgc2VnW2lkeF0uY250PTA7CiAgICAgICAgaW50IGIgPSAoU1tsXT09Jz4nKTsKICAgICAgICBzZWdbaWR4XS5wcmVmPWI7IHNlZ1tpZHhdLmxwPTE7CiAgICAgICAgc2VnW2lkeF0uc3VmZj1iOyBzZWdbaWR4XS5scz0xOwogICAgICAgIHNlZ1tpZHhdLmxhenk9ZmFsc2U7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaW50IG09KGwrcik+PjE7CiAgICBidWlsZChpZHg8PDEsbCxtKTsKICAgIGJ1aWxkKGlkeDw8MXwxLG0rMSxyKTsKICAgIHNlZ1tpZHhdPW1lcmdlX25vZGUoc2VnW2lkeDw8MV0sc2VnW2lkeDw8MXwxXSk7Cn0KCnZvaWQgdXBkYXRlKGludCBpZHgsaW50IGwsaW50IHIsaW50IHFsLGludCBxcil7CiAgICBpZihxbD5yfHxxcjxsKSByZXR1cm47CiAgICBpZihxbDw9bCYmcjw9cXIpewogICAgICAgIGFwcGx5X2ZsaXAoc2VnW2lkeF0pOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHB1c2goaWR4KTsKICAgIGludCBtPShsK3IpPj4xOwogICAgdXBkYXRlKGlkeDw8MSxsLG0scWwscXIpOwogICAgdXBkYXRlKGlkeDw8MXwxLG0rMSxyLHFsLHFyKTsKICAgIHNlZ1tpZHhdPW1lcmdlX25vZGUoc2VnW2lkeDw8MV0sc2VnW2lkeDw8MXwxXSk7Cn0KCmludCBtYWluKCl7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwoKICAgIGNpbj4+TjsKICAgIGNpbj4+UzsKICAgIGludCBROyBjaW4+PlE7CiAgICBzZWcuYXNzaWduKDQqTis1LE5vZGUoKSk7CiAgICBidWlsZCgxLDAsTi0xKTsKCiAgICB3aGlsZShRLS0pewogICAgICAgIGludCB0OyBjaW4+PnQ7CiAgICAgICAgaWYodD09MSl7CiAgICAgICAgICAgIGludCBsLHI7IGNpbj4+bD4+cjsKICAgICAgICAgICAgLS1sOyAtLXI7CiAgICAgICAgICAgIHVwZGF0ZSgxLDAsTi0xLGwscik7CiAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIGNvdXQ8PHNlZ1sxXS5jbnQ8PCJcbiI7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDA7Cn0=