多水的一道题啊,枉费了我辛辛苦苦码的莫队。。。
目测线段树啥的都能搞,不过好蠢。。。
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100005;
int n,m;
int pre[4][maxn];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
int tmp;
scanf("%d",&tmp);
for(int j=1;j<=3;j++)
pre[j][i]=pre[j][i-1]+(tmp==j);
}
while(m--)
{
int l,r;
scanf("%d%d",&l,&r);
printf("%d %d %d\n",pre[1][r]-pre[1][l-1],pre[2][r]-pre[2][l-1],pre[3][r]-pre[3][l-1]);
}
return 0;
}
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=100005;
int n,m;
int s[maxn],res[maxn][4],ans[4];
struct query
{
int l,r,block,id;
bool operator < (const query tmp) const
{
if(block==tmp.block)
return r<tmp.r;
return block<tmp.block;
}
}q[maxn];
int main()
{
scanf("%d%d",&n,&m);
int bl=sqrt(n);
for(int i=1;i<=n;i++)
scanf("%d",s+i);
for(int i=1;i<=m;i++)
scanf("%d%d",&q[i].l,&q[i].r),
q[i].id=i,
q[i].block=(q[i].l-1)/bl+1;
sort(q+1,q+m+1);
int l=1,r=0;
for(int i=1;i<=m;i++)
{
while(q[i].l<l)
{
l--;
ans[s[l]]++;
}
while(q[i].r>r)
{
r++;
ans[s[r]]++;
}
while(q[i].l>l)
{
ans[s[l]]--;
l++;
}
while(q[i].r<r)
{
ans[s[r]]--;
r--;
}
for(int j=1;j<=3;j++)
res[q[i].id][j]=ans[j];
}
for(int i=1;i<=m;i++)
printf("%d %d %d\n",res[i][1],res[i][2],res[i][3]);
return 0;
}