啥都过了,但是一交上去就挂了
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m;
ll g,q[60010];
char c;
struct qwq{
ll x,y;
ll id;
}a[60010];
bool cmp(qwq x,qwq y)
{
if(x.x/g==y.x/g)
{
if((x.x/g)&1)return x.y<y.y;
else return x.y>y.y;
}
else return x.x<y.x;
}
ll l=1,r,sum,ql,qr;
ll f[1<<27];
ll ans[60010];
void q1(ll x)
{
sum+=f[q[x]];
for(int i=0;i<=25;i++)sum+=f[q[x]^(1<<i)];
f[q[x]]++;
}
void q2(ll x)
{
f[q[x]]--;
for(int i=0;i<=25;i++)sum-=f[q[x]^(1<<i)];
sum-=f[q[x]];
}
int main()
{
scanf("%lld%lld",&n,&m);
g=sqrt(n);
c=getchar();
for(int i=1;i<=n;i++)
{
c=getchar();
q[i]=q[i-1]^(1<<(c-'a'));
}
for(int i=1;i<=m;i++)
{
scanf("%lld%lld",&a[i].x,&a[i].y);
a[i].id=i;
}
sort(a+1,a+1+m,cmp);
f[0]=1;
for(int i=1;i<=m;i++)
{
ql=a[i].x;
qr=a[i].y;
while(r<qr)q1(++r);
while(l>ql)q1(--l-1);
while(l<ql)q2(l++-1);
while(r>qr)q2(r--);
ans[a[i].id]=sum;
}
for(int i=1;i<=m;i++)printf("%lld\n",ans[i]);
}