#include<stdio.h>
#include<string.h>
#ifndef ONLINE_JUDGE
#define get getchar
#else
#define get getchar_unlocked
#endif
inline int scan_f()
{
int n=0,s=1;
char p=get();
if(p=='-')
s=-1;
while((p<'0' || p>'9') && p!=EOF && p!='-')
p=get();
if(p=='-')
s=-1,p=get();
while(p>='0' && p<='9' )
{
n=(n<<3)+(n<<1)+(p-'0');
p=get();
}
return (n*s);
}
#define max_size 1000005
typedef long long int lli;
struct seg_t{
lli c,h,e,f,ch,ce,cf,hc,ec,fc,he,hf,eh,fh,ef,fe;
};
char s[1000005];
struct seg_t tree[4*max_size];
void construct( int node, int i, int j )
{
if(i==j)
{
tree[node]=((struct seg_t) { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0});
if(s[i]=='c')
tree[node].c++;
else if(s[i]=='h')
tree[node].h++;
else if(s[i]=='e')
tree[node].e++;
else if(s[i]=='f')
tree[node].f++;
}
else
{
construct( node*2, i , (i + j)/2);
construct( node*2+1, (i+j)/2 + 1, j);
struct seg_t left = tree[node*2];
struct seg_t right = tree[node*2+1];
tree[node].c=left.c+right.c;
tree[node].h=left.h+right.h;
tree[node].e=left.e+right.e;
tree[node].f=left.f+right.f;
tree[node].ch+=(left.c*right.h) + left.ch + right.ch;
tree[node].ce+=(left.c*right.e) + left.ce + right.ce;
tree[node].cf+=(left.c*right.f) + left.cf + right.cf;
tree[node].hc+=(left.h*right.c) + left.hc + right.hc;
tree[node].ec+=(left.e*right.c) + left.ec + right.ec;
tree[node].fc+=(left.f*right.c) + left.fc + right.fc;
tree[node].he+=(left.h*right.e) + left.he + right.he;
tree[node].hf+=(left.h*right.f) + left.hf + right.hf;
tree[node].eh+=(left.e*right.h) + left.eh + right.eh;
tree[node].fh+=(left.f*right.h) + left.fh + right.fh;
tree[node].ef+=(left.e*right.f) + left.ef + right.ef;
tree[node].fe+=(left.f*right.e) + left.fe + right.fe;
}
}
struct seg_t query(int node, int a, int b, int i, int j)
{
if( a==i && b==j)
return tree[node];
else if ( j <= ( a + b ) / 2 ) {
return query( node * 2, a, ( a + b ) / 2, i, j );
}
if ( i > ( a + b ) / 2 ) {
return query( node * 2 + 1, ( a + b ) / 2 + 1, b, i, j );
}
struct seg_t left = query( node * 2, a, ( a + b ) / 2, i, ( a + b ) / 2 );
struct seg_t right = query( node * 2 + 1, ( a + b ) / 2 + 1, b, ( a + b ) / 2 + 1, j );
struct seg_t ans;
ans.c=left.c+right.c;
ans.h=left.h+right.h;
ans.e=left.e+right.e;
ans.f=left.f+right.f;
ans.ch+=(left.c*right.h) + left.ch + right.ch;
ans.ce+=(left.c*right.e) + left.ce + right.ce;
ans.cf+=(left.c*right.f) + left.cf + right.cf;
ans.hc+=(left.h*right.c) + left.hc + right.hc;
ans.ec+=(left.e*right.c) + left.ec + right.ec;
ans.fc+=(left.f*right.c) + left.fc + right.fc;
ans.he+=(left.h*right.e) + left.he + right.he;
ans.hf+=(left.h*right.f) + left.hf + right.hf;
ans.eh+=(left.e*right.h) + left.eh + right.eh;
ans.fh+=(left.f*right.h) + left.fh + right.fh;
ans.ef+=(left.e*right.f) + left.ef + right.ef;
ans.fe+=(left.f*right.e) + left.fe + right.fe;
return ans;
}
main()
{
int q,l,i,x,y;
lli ans;
char a,b;
construct(1,0,l-1);
/*for(i=1;i<10;i++)
{
printf("%d %d %d %d %d %d %d %d %d %d %d %d\n",tree[i].c,tree[i].h,tree[i].e,tree[i].f,tree[i].ch,tree[i].ce,tree[i].cf,tree[i].hc,tree[i].ec,tree[i].fc,tree[i].he,tree[i].hf);
}*/
q=scan_f();
for(i=0;i<q;i++)
{
x=scan_f();
y=scan_f();
//printf("%c %c %d %d\n",a,b,x,y);
struct seg_t q=query(1,0,l-1,x-1,y-1);
if(a=='c' && b=='h')
ans=q.ch;
else if(a=='c' && b=='e')
ans=q.ce;
else if(a=='c' && b=='f')
ans=q.cf;
else if(a=='h' && b=='c')
ans=q.hc;
else if(a=='e' && b=='c')
ans=q.ec;
else if(a=='f' && b=='c')
ans=q.fc;
else if(a=='h' && b=='e')
ans=q.he;
else if(a=='h' && b=='f')
ans=q.hf;
else if(a=='e' && b=='h')
ans=q.eh;
else if(a=='f' && b=='h')
ans=q.fh;
else if(a=='e' && b=='f')
ans=q.ef;
else if(a=='f' && b=='e')
ans=q.fe;
}
return 0;
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8c3RyaW5nLmg+CiNpZm5kZWYgT05MSU5FX0pVREdFCiNkZWZpbmUgZ2V0IGdldGNoYXIKI2Vsc2UKI2RlZmluZSBnZXQgZ2V0Y2hhcl91bmxvY2tlZAojZW5kaWYKaW5saW5lIGludCBzY2FuX2YoKQp7CglpbnQgbj0wLHM9MTsKCWNoYXIgcD1nZXQoKTsKCWlmKHA9PSctJykKCQlzPS0xOwoJd2hpbGUoKHA8JzAnIHx8IHA+JzknKSAmJiBwIT1FT0YgJiYgcCE9Jy0nKQoJCXA9Z2V0KCk7CglpZihwPT0nLScpCgkJcz0tMSxwPWdldCgpOwoJd2hpbGUocD49JzAnICYmIHA8PSc5JyApCgl7CgkJbj0objw8MykrKG48PDEpKyhwLScwJyk7CgkJcD1nZXQoKTsKCX0KCXJldHVybiAobipzKTsKfQojZGVmaW5lIG1heF9zaXplIDEwMDAwMDUKICAgICAKdHlwZWRlZiBsb25nIGxvbmcgaW50IGxsaTsKCnN0cnVjdCBzZWdfdHsKbGxpIGMsaCxlLGYsY2gsY2UsY2YsaGMsZWMsZmMsaGUsaGYsZWgsZmgsZWYsZmU7Cn07CmNoYXIgc1sxMDAwMDA1XTsKc3RydWN0IHNlZ190IHRyZWVbNCptYXhfc2l6ZV07CiAgICAgCnZvaWQgY29uc3RydWN0KCBpbnQgbm9kZSwgaW50IGksIGludCBqICkKewoJICAgIGlmKGk9PWopCiAgICAJewogICAgCQl0cmVlW25vZGVdPSgoc3RydWN0IHNlZ190KSB7IDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9KTsKICAgIAkJaWYoc1tpXT09J2MnKQogICAgCQl0cmVlW25vZGVdLmMrKzsKICAgIAkJZWxzZSBpZihzW2ldPT0naCcpCiAgICAJCXRyZWVbbm9kZV0uaCsrOwogICAgCQllbHNlIGlmKHNbaV09PSdlJykKICAgIAkJdHJlZVtub2RlXS5lKys7CiAgICAJCWVsc2UgaWYoc1tpXT09J2YnKQogICAgCQl0cmVlW25vZGVdLmYrKzsKICAgIAl9CiAgICAJZWxzZQogICAgCXsKICAgIAkJY29uc3RydWN0KCBub2RlKjIsIGkgLCAoaSArIGopLzIpOwogICAgCQljb25zdHJ1Y3QoIG5vZGUqMisxLCAoaStqKS8yICsgMSwgaik7CiAgICAJCXN0cnVjdCBzZWdfdCBsZWZ0ID0gdHJlZVtub2RlKjJdOwogICAgCQlzdHJ1Y3Qgc2VnX3QgcmlnaHQgPSB0cmVlW25vZGUqMisxXTsKICAgIAkJdHJlZVtub2RlXS5jPWxlZnQuYytyaWdodC5jOwogICAgCQl0cmVlW25vZGVdLmg9bGVmdC5oK3JpZ2h0Lmg7CiAgICAJCXRyZWVbbm9kZV0uZT1sZWZ0LmUrcmlnaHQuZTsKICAgIAkJdHJlZVtub2RlXS5mPWxlZnQuZityaWdodC5mOwogICAgCQl0cmVlW25vZGVdLmNoKz0obGVmdC5jKnJpZ2h0LmgpICsgbGVmdC5jaCArIHJpZ2h0LmNoOwogICAgCQl0cmVlW25vZGVdLmNlKz0obGVmdC5jKnJpZ2h0LmUpICsgbGVmdC5jZSArIHJpZ2h0LmNlOwogICAgCQl0cmVlW25vZGVdLmNmKz0obGVmdC5jKnJpZ2h0LmYpICsgbGVmdC5jZiArIHJpZ2h0LmNmOwogICAgCQl0cmVlW25vZGVdLmhjKz0obGVmdC5oKnJpZ2h0LmMpICsgbGVmdC5oYyArIHJpZ2h0LmhjOwogICAgCQl0cmVlW25vZGVdLmVjKz0obGVmdC5lKnJpZ2h0LmMpICsgbGVmdC5lYyArIHJpZ2h0LmVjOwogICAgCQl0cmVlW25vZGVdLmZjKz0obGVmdC5mKnJpZ2h0LmMpICsgbGVmdC5mYyArIHJpZ2h0LmZjOwogICAgCQl0cmVlW25vZGVdLmhlKz0obGVmdC5oKnJpZ2h0LmUpICsgbGVmdC5oZSArIHJpZ2h0LmhlOwogICAgCQl0cmVlW25vZGVdLmhmKz0obGVmdC5oKnJpZ2h0LmYpICsgbGVmdC5oZiArIHJpZ2h0LmhmOwogICAgCQl0cmVlW25vZGVdLmVoKz0obGVmdC5lKnJpZ2h0LmgpICsgbGVmdC5laCArIHJpZ2h0LmVoOyAKICAgIAkJdHJlZVtub2RlXS5maCs9KGxlZnQuZipyaWdodC5oKSArIGxlZnQuZmggKyByaWdodC5maDsKICAgIAkJdHJlZVtub2RlXS5lZis9KGxlZnQuZSpyaWdodC5mKSArIGxlZnQuZWYgKyByaWdodC5lZjsKICAgIAkJdHJlZVtub2RlXS5mZSs9KGxlZnQuZipyaWdodC5lKSArIGxlZnQuZmUgKyByaWdodC5mZTsKICAgIAl9Cn0KICAgICAKc3RydWN0IHNlZ190IHF1ZXJ5KGludCBub2RlLCBpbnQgYSwgaW50IGIsIGludCBpLCBpbnQgaikKewogICAgaWYoIGE9PWkgJiYgYj09aikKICAgIHJldHVybiB0cmVlW25vZGVdOwogICAgZWxzZSBpZiAoIGogPD0gKCBhICsgYiApIC8gMiApIHsKICAgIHJldHVybiBxdWVyeSggbm9kZSAqIDIsIGEsICggYSArIGIgKSAvIDIsIGksIGogKTsKICAgIH0KICAgIGlmICggaSA+ICggYSArIGIgKSAvIDIgKSB7CiAgICByZXR1cm4gcXVlcnkoIG5vZGUgKiAyICsgMSwgKCBhICsgYiApIC8gMiArIDEsIGIsIGksIGogKTsKICAgIH0KICAgIHN0cnVjdCBzZWdfdCBsZWZ0ID0gcXVlcnkoIG5vZGUgKiAyLCBhLCAoIGEgKyBiICkgLyAyLCBpLCAoIGEgKyBiICkgLyAyICk7CiAgICBzdHJ1Y3Qgc2VnX3QgcmlnaHQgPSBxdWVyeSggbm9kZSAqIDIgKyAxLCAoIGEgKyBiICkgLyAyICsgMSwgYiwgKCBhICsgYiApIC8gMiArIDEsIGogKTsKICAgIHN0cnVjdCBzZWdfdCBhbnM7CiAgICBhbnMuYz1sZWZ0LmMrcmlnaHQuYzsKICAgIGFucy5oPWxlZnQuaCtyaWdodC5oOwogICAgYW5zLmU9bGVmdC5lK3JpZ2h0LmU7CiAgIAlhbnMuZj1sZWZ0LmYrcmlnaHQuZjsKICAgIGFucy5jaCs9KGxlZnQuYypyaWdodC5oKSArIGxlZnQuY2ggKyByaWdodC5jaDsKICAgIGFucy5jZSs9KGxlZnQuYypyaWdodC5lKSArIGxlZnQuY2UgKyByaWdodC5jZTsKICAgIGFucy5jZis9KGxlZnQuYypyaWdodC5mKSArIGxlZnQuY2YgKyByaWdodC5jZjsKICAgIGFucy5oYys9KGxlZnQuaCpyaWdodC5jKSArIGxlZnQuaGMgKyByaWdodC5oYzsKICAgIGFucy5lYys9KGxlZnQuZSpyaWdodC5jKSArIGxlZnQuZWMgKyByaWdodC5lYzsKICAgIGFucy5mYys9KGxlZnQuZipyaWdodC5jKSArIGxlZnQuZmMgKyByaWdodC5mYzsKICAgIGFucy5oZSs9KGxlZnQuaCpyaWdodC5lKSArIGxlZnQuaGUgKyByaWdodC5oZTsKICAgIGFucy5oZis9KGxlZnQuaCpyaWdodC5mKSArIGxlZnQuaGYgKyByaWdodC5oZjsKICAgIGFucy5laCs9KGxlZnQuZSpyaWdodC5oKSArIGxlZnQuZWggKyByaWdodC5laDsgCiAgICBhbnMuZmgrPShsZWZ0LmYqcmlnaHQuaCkgKyBsZWZ0LmZoICsgcmlnaHQuZmg7CiAgICBhbnMuZWYrPShsZWZ0LmUqcmlnaHQuZikgKyBsZWZ0LmVmICsgcmlnaHQuZWY7CiAgICBhbnMuZmUrPShsZWZ0LmYqcmlnaHQuZSkgKyBsZWZ0LmZlICsgcmlnaHQuZmU7CiAgICByZXR1cm4gYW5zOwp9CiAgICAgCgptYWluKCkKewoJc2NhbmYoIiVzIiwmcyk7CiAgICBpbnQgcSxsLGkseCx5OwoJbGxpIGFuczsKICAgIGw9c3RybGVuKHMpOwogICAgY2hhciBhLGI7CiAgICBjb25zdHJ1Y3QoMSwwLGwtMSk7CiAgICAvKmZvcihpPTE7aTwxMDtpKyspCiAgICB7CiAgICBwcmludGYoIiVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkXG4iLHRyZWVbaV0uYyx0cmVlW2ldLmgsdHJlZVtpXS5lLHRyZWVbaV0uZix0cmVlW2ldLmNoLHRyZWVbaV0uY2UsdHJlZVtpXS5jZix0cmVlW2ldLmhjLHRyZWVbaV0uZWMsdHJlZVtpXS5mYyx0cmVlW2ldLmhlLHRyZWVbaV0uaGYpOwogICAgfSovCiAgICBxPXNjYW5fZigpOwogICAgZm9yKGk9MDtpPHE7aSsrKQogICAgewogICAgc2NhbmYoIiAlYyAlYyIsJmEsJmIpOwogICAgeD1zY2FuX2YoKTsKICAgIHk9c2Nhbl9mKCk7CiAgICAvL3ByaW50ZigiJWMgJWMgJWQgJWRcbiIsYSxiLHgseSk7CiAgICBzdHJ1Y3Qgc2VnX3QgcT1xdWVyeSgxLDAsbC0xLHgtMSx5LTEpOwogICAgaWYoYT09J2MnICYmIGI9PSdoJykKICAgIGFucz1xLmNoOwogICAgZWxzZSBpZihhPT0nYycgJiYgYj09J2UnKQogICAgYW5zPXEuY2U7CiAgICBlbHNlIGlmKGE9PSdjJyAmJiBiPT0nZicpCiAgICBhbnM9cS5jZjsKICAgIGVsc2UgaWYoYT09J2gnICYmIGI9PSdjJykKICAgIGFucz1xLmhjOwogICAgZWxzZSBpZihhPT0nZScgJiYgYj09J2MnKQogICAgYW5zPXEuZWM7CiAgICBlbHNlIGlmKGE9PSdmJyAmJiBiPT0nYycpCiAgICBhbnM9cS5mYzsKICAgIGVsc2UgaWYoYT09J2gnICYmIGI9PSdlJykKICAgIGFucz1xLmhlOwogICAgZWxzZSBpZihhPT0naCcgJiYgYj09J2YnKQogICAgYW5zPXEuaGY7CiAgICBlbHNlIGlmKGE9PSdlJyAmJiBiPT0naCcpCiAgICBhbnM9cS5laDsKICAgIGVsc2UgaWYoYT09J2YnICYmIGI9PSdoJykKICAgIGFucz1xLmZoOwogICAgZWxzZSBpZihhPT0nZScgJiYgYj09J2YnKQogICAgYW5zPXEuZWY7CiAgICBlbHNlIGlmKGE9PSdmJyAmJiBiPT0nZScpCiAgICBhbnM9cS5mZTsKICAgIHByaW50ZigiJWxsZFxuIixhbnMpOwogICAgfQogICAgcmV0dXJuIDA7Cn0g