感谢你能点进来
本蒟蒻初学莫队
看了好久也不知道为什么RE
大概一定是我太菜了
这是反馈信息:runtime error (SIGSEGV)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define rg register
#define il inline
#define MAXN 30010
#define SQRTN 180
#define MAXM 200010
#define MAXX 1000010
using namespace std;
il void init(int &x)
{
x = 0;
char c = getchar();
while(c>'9' || c<'0') c = getchar();
while(c>='0' && c<='9')
{
x = (x<<1) + (x<<3) + (c^48);
c = getchar();
}
}
//int n, m, rtn, a[MAXN], pos[SQRTN], ans[MAXM], ctr[MAXX], now, nl=0, nr=0;
int n, m, rtn, a[MAXX], pos[MAXX], ans[MAXX], ctr[MAXX], now, nl=0, nr=0; //开最大了然而还是RE
struct question{
int l, r, id;
}q[MAXN];
il bool cmp(question a, question b)
{
return pos[a.l]^pos[b.l] ? pos[a.l]<pos[b.l] : (pos[a.l]&1 ? a.r<b.r : a.r>b.r);
}
il void del(int x)
{
--ctr[a[x]];
if(!ctr[a[x]]) --now;
}
il void add(int x)
{
if(!ctr[a[x]]) ++now;
++ctr[a[x]];
}
int main()
{
init(n);
rtn = sqrt(n);
for(rg int i=1, top=(n+rtn-1)/rtn ; i<=top ; i++)
for(rg int j=(i-1)*rtn+1 ; j<=rtn*i ; j++)
pos[j] = i;
for(rg int i=1 ; i<=n ; i++)
init(a[i]);
init(m);
for(rg int i=1 ; i<=m ; i++)
{
init(q[i].l);
init(q[i].r);
q[i].id = i;
}
sort(q+1, q+m+1, cmp);
for(rg int i=1 ; i<=m ; i++)
{
int qr = q[i].r, ql = q[i].l;
while(nr < qr) add(++nr);
while(nr > qr) del(nr--);
while(nl < ql) del(nl++);
while(nl > ql) add(--nl);
ans[q[i].id] = now;
}
for(rg int i=1 ; i<=m ; i++)
printf("%d\n", ans[i]);
return 0;
}
谢谢各位dalao能看到这里 本蒟蒻先orz为敬