在循环内输出正确,放dy数组里就会输出奇怪数字
#include<bits/stdc++.h>
using namespace std;
vector<int>wz[1000086];
int t[1000086];
struct xy{
int x,y,i;
bool operator<(const xy&a)const
{
return x!=a.x?x<a.x:y<a.y;
}
}oppo[1000086];
int s[1000086];
int c[1000086];
int a[1000086];
int op[1000086];
void mk(int l,int r,int x)
{
if(l==r){
op[x]=s[l];
return;
}
int md=l+r>>1;
mk(l,md,x<<1);
mk(md+1,r,x<<1|1);
op[x]=op[x<<1]+op[x<<1|1];
}
void ist(int l,int r,int k,int s,int x)
{
if(l==r){
op[x]=s;
return;
}
int md=l+r>>1;
if(md>=k)ist(l,md,k,s,x<<1);
else ist(md+1,r,k,s,x<<1|1);
op[x]=op[x<<1]+op[x<<1|1];
}
int qst(int o,int p,int l,int r,int x)
{
if(l<=o&&p<=r){
return op[x];
}
int md=o+p>>1;
int s=0;
if(l<=md)s+=qst(o,md,l,r,x<<1);
if(r>md)s+=qst(md+1,p,l,r,x<<1|1);
return s;
}
int dy[1000086];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
wz[a[i]].push_back(i);
if(++c[a[i]]==1){
s[i]=1;
}
}
mk(1,n,1);
int m;
cin>>m;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&oppo[i].x,&oppo[i].y);
oppo[i].i=i;
}
sort(oppo+1,oppo+m+1);
int hd=1;
for(int i=1;i<=m;i++)
{
while(hd<oppo[i].x){
ist(1,n,hd,0,1);
if(t[a[hd]]+1<wz[a[hd]].size()){
ist(1,n,wz[a[hd]][t[a[hd]]+1],1,1);
t[a[hd]]++;
}
hd++;
}
dy[oppo[i].i]=qst(1,n,oppo[i].x,oppo[i].y,1);
}
for(int i=1;i<=m;i++)
{
cout<<dy[i]<<endl;
}
return 0;
}