#include <bits/stdc++.h>
using namespace std;
struct Node {
int len;
int cnt;
string pref;
string suff;
bool lazy;
Node(): len(0), cnt(0), pref(""), suff(""), lazy(false) {}
};
int N;
string S;
vector<Node> seg;
bool is_fish3(const string &t){
return (t == "><>" || t == "<><");
}
string flip_str(const string &t){
string r = t;
for(char &c: r) c = (c == '>' ? '<' : '>');
return r;
}
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;
string mid = L.suff + R.pref;
int ls = (int)L.suff.size();
int ms = (int)mid.size();
for(int i = 0; i + 3 <= ms; ++i){
if(i < ls && i+2 >= ls){
if(is_fish3(mid.substr(i,3))) res.cnt++;
}
}
if(L.len >= 2) res.pref = L.pref;
else {
res.pref = L.pref + R.pref;
if((int)res.pref.size() > 2) res.pref = res.pref.substr(0,2);
}
if(R.len >= 2) res.suff = R.suff;
else {
res.suff = L.suff + R.suff;
if((int)res.suff.size() > 2) res.suff = res.suff.substr((int)res.suff.size()-2);
}
res.lazy = false;
return res;
}
void apply_flip(Node &v){
if(v.len == 0) return;
v.pref = flip_str(v.pref);
v.suff = flip_str(v.suff);
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;
seg[idx].pref = seg[idx].suff = string(1, S[l]);
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_flip(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_flip(idx<<1, l, m, ql, qr);
update_flip(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;
if(N == 0){
while(Q--){
int t; cin >> t;
if(t == 1){
int l,r; cin >> l >> r;
} else cout << 0 << '\n';
}
return 0;
}
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_flip(1, 0, N-1, l, r);
} else {
cout << seg[1].cnt << '\n';
}
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgTm9kZSB7CiAgICBpbnQgbGVuOwogICAgaW50IGNudDsKICAgIHN0cmluZyBwcmVmOwogICAgc3RyaW5nIHN1ZmY7CiAgICBib29sIGxhenk7CiAgICBOb2RlKCk6IGxlbigwKSwgY250KDApLCBwcmVmKCIiKSwgc3VmZigiIiksIGxhenkoZmFsc2UpIHt9Cn07CgppbnQgTjsKc3RyaW5nIFM7CnZlY3RvcjxOb2RlPiBzZWc7Cgpib29sIGlzX2Zpc2gzKGNvbnN0IHN0cmluZyAmdCl7CiAgICByZXR1cm4gKHQgPT0gIj48PiIgfHwgdCA9PSAiPD48Iik7Cn0KCnN0cmluZyBmbGlwX3N0cihjb25zdCBzdHJpbmcgJnQpewogICAgc3RyaW5nIHIgPSB0OwogICAgZm9yKGNoYXIgJmM6IHIpIGMgPSAoYyA9PSAnPicgPyAnPCcgOiAnPicpOwogICAgcmV0dXJuIHI7Cn0KCk5vZGUgbWVyZ2Vfbm9kZShjb25zdCBOb2RlICZMLCBjb25zdCBOb2RlICZSKXsKICAgIGlmKEwubGVuID09IDApIHJldHVybiBSOwogICAgaWYoUi5sZW4gPT0gMCkgcmV0dXJuIEw7CiAgICBOb2RlIHJlczsKICAgIHJlcy5sZW4gPSBMLmxlbiArIFIubGVuOwogICAgcmVzLmNudCA9IEwuY250ICsgUi5jbnQ7CiAgICBzdHJpbmcgbWlkID0gTC5zdWZmICsgUi5wcmVmOwogICAgaW50IGxzID0gKGludClMLnN1ZmYuc2l6ZSgpOwogICAgaW50IG1zID0gKGludCltaWQuc2l6ZSgpOwogICAgZm9yKGludCBpID0gMDsgaSArIDMgPD0gbXM7ICsraSl7CiAgICAgICAgaWYoaSA8IGxzICYmIGkrMiA+PSBscyl7CiAgICAgICAgICAgIGlmKGlzX2Zpc2gzKG1pZC5zdWJzdHIoaSwzKSkpIHJlcy5jbnQrKzsKICAgICAgICB9CiAgICB9CiAgICBpZihMLmxlbiA+PSAyKSByZXMucHJlZiA9IEwucHJlZjsKICAgIGVsc2UgewogICAgICAgIHJlcy5wcmVmID0gTC5wcmVmICsgUi5wcmVmOwogICAgICAgIGlmKChpbnQpcmVzLnByZWYuc2l6ZSgpID4gMikgcmVzLnByZWYgPSByZXMucHJlZi5zdWJzdHIoMCwyKTsKICAgIH0KICAgIGlmKFIubGVuID49IDIpIHJlcy5zdWZmID0gUi5zdWZmOwogICAgZWxzZSB7CiAgICAgICAgcmVzLnN1ZmYgPSBMLnN1ZmYgKyBSLnN1ZmY7CiAgICAgICAgaWYoKGludClyZXMuc3VmZi5zaXplKCkgPiAyKSByZXMuc3VmZiA9IHJlcy5zdWZmLnN1YnN0cigoaW50KXJlcy5zdWZmLnNpemUoKS0yKTsKICAgIH0KICAgIHJlcy5sYXp5ID0gZmFsc2U7CiAgICByZXR1cm4gcmVzOwp9Cgp2b2lkIGFwcGx5X2ZsaXAoTm9kZSAmdil7CiAgICBpZih2LmxlbiA9PSAwKSByZXR1cm47CiAgICB2LnByZWYgPSBmbGlwX3N0cih2LnByZWYpOwogICAgdi5zdWZmID0gZmxpcF9zdHIodi5zdWZmKTsKICAgIHYubGF6eSA9ICF2Lmxhenk7Cn0KCnZvaWQgcHVzaChpbnQgaWR4KXsKICAgIGlmKHNlZ1tpZHhdLmxhenkpewogICAgICAgIGFwcGx5X2ZsaXAoc2VnW2lkeDw8MV0pOwogICAgICAgIGFwcGx5X2ZsaXAoc2VnW2lkeDw8MXwxXSk7CiAgICAgICAgc2VnW2lkeF0ubGF6eSA9IGZhbHNlOwogICAgfQp9Cgp2b2lkIGJ1aWxkKGludCBpZHgsIGludCBsLCBpbnQgcil7CiAgICBpZihsID09IHIpewogICAgICAgIHNlZ1tpZHhdLmxlbiA9IDE7CiAgICAgICAgc2VnW2lkeF0uY250ID0gMDsKICAgICAgICBzZWdbaWR4XS5wcmVmID0gc2VnW2lkeF0uc3VmZiA9IHN0cmluZygxLCBTW2xdKTsKICAgICAgICBzZWdbaWR4XS5sYXp5ID0gZmFsc2U7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaW50IG0gPSAobCArIHIpID4+IDE7CiAgICBidWlsZChpZHg8PDEsIGwsIG0pOwogICAgYnVpbGQoaWR4PDwxfDEsIG0rMSwgcik7CiAgICBzZWdbaWR4XSA9IG1lcmdlX25vZGUoc2VnW2lkeDw8MV0sIHNlZ1tpZHg8PDF8MV0pOwp9Cgp2b2lkIHVwZGF0ZV9mbGlwKGludCBpZHgsIGludCBsLCBpbnQgciwgaW50IHFsLCBpbnQgcXIpewogICAgaWYocWwgPiByIHx8IHFyIDwgbCkgcmV0dXJuOwogICAgaWYocWwgPD0gbCAmJiByIDw9IHFyKXsKICAgICAgICBhcHBseV9mbGlwKHNlZ1tpZHhdKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBwdXNoKGlkeCk7CiAgICBpbnQgbSA9IChsICsgcikgPj4gMTsKICAgIHVwZGF0ZV9mbGlwKGlkeDw8MSwgbCwgbSwgcWwsIHFyKTsKICAgIHVwZGF0ZV9mbGlwKGlkeDw8MXwxLCBtKzEsIHIsIHFsLCBxcik7CiAgICBzZWdbaWR4XSA9IG1lcmdlX25vZGUoc2VnW2lkeDw8MV0sIHNlZ1tpZHg8PDF8MV0pOwp9CgppbnQgbWFpbigpewogICAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShudWxscHRyKTsKICAgIGNpbiA+PiBOOwogICAgY2luID4+IFM7CiAgICBpbnQgUTsgY2luID4+IFE7CiAgICBpZihOID09IDApewogICAgICAgIHdoaWxlKFEtLSl7CiAgICAgICAgICAgIGludCB0OyBjaW4gPj4gdDsKICAgICAgICAgICAgaWYodCA9PSAxKXsKICAgICAgICAgICAgICAgIGludCBsLHI7IGNpbiA+PiBsID4+IHI7CiAgICAgICAgICAgIH0gZWxzZSBjb3V0IDw8IDAgPDwgJ1xuJzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBzZWcuYXNzaWduKDQgKiBOICsgNSwgTm9kZSgpKTsKICAgIGJ1aWxkKDEsIDAsIE4tMSk7CiAgICB3aGlsZShRLS0pewogICAgICAgIGludCB0OyBjaW4gPj4gdDsKICAgICAgICBpZih0ID09IDEpewogICAgICAgICAgICBpbnQgbCwgcjsgY2luID4+IGwgPj4gcjsKICAgICAgICAgICAgLS1sOyAtLXI7CiAgICAgICAgICAgIHVwZGF0ZV9mbGlwKDEsIDAsIE4tMSwgbCwgcik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY291dCA8PCBzZWdbMV0uY250IDw8ICdcbic7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDA7Cn0=