BC的第29场的题,当时中文题目数据范围给的10^5,英文题目中是10^6,后来按照中文的数据范围,就线段树水过,但是我觉得不应该放在C,应该是英文的数据范围,我就说为什么这题放在C的位置。
好,我按照题解写了一发。
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctime>
using namespace std;
typedef unsigned __int64 ULL;
ULL one=1;
ULL ha[1000010];
ULL a[1000010];
ULL sum1[1000010];
ULL sum2[1000010];
int main()
{
int n,m;
srand(time(NULL));
while(scanf("%d %d",&n,&m)!=EOF)
{
for(int i=1;i<=n;i++)
{
ha[i]=rand()*(one<<47)+rand()*(one<<31)+rand()*(one<<15)+rand();
}
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
a[i]=ha[x];
}
sum1[0]=sum2[0]=0;
for(int i=1;i<=n;i++)
{
sum1[i]=sum1[i-1]^ha[i];
sum2[i]=sum2[i-1]^a[i];
}
for(int i=1;i<=m;i++)
{
int l,r;
scanf("%d %d",&l,&r);
ULL tmp1=sum1[r-l+1];
ULL tmp2=sum2[l-1]^sum2[r];
if(tmp1==tmp2)
printf("YES\n");
else printf("NO\n");
}
}
return 0;
}