P3792 由乃与大母神原型和偶像崇拜
人生第一道 由乃题
将每个值映射为一个随机数,然后像哈希一样判:可以通过区间的和判断出等差数列的最小值和最大值,再用区间异或值和该等差数列的异或值比较,如果相等即为连续,否则不连续
#include<bits/stdc++.h>
using namespace std;
int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9') f=(ch=='-')?-1:1,ch=getchar();
while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x*f;
}
const int N=300005;
int a[N],b[N<<2],c2[N],opt[N],x[N],y[N],c[N<<2],pre[N<<2],n;
long long c1[N];
void add1(int x,int k){while(x<=n) c1[x]+=k,x+=x&-x;return;}
void add2(int x,int k){while(x<=n) c2[x]^=k,x+=x&-x;return;}
long long query1(int x){long long s=0;while(x) s+=c1[x],x-=x&-x;return s;}
int query2(int x){int s=0;while(x) s^=c2[x],x-=x&-x;return s;}
int main()
{
srand(time(0));
n=read();int m=read(),tot=n<<1;
for(int i=1;i<=n;i++) b[n+i]=(b[i]=a[i]=read())+1;
for(int i=1;i<=m;i++)
{
opt[i]=read(),x[i]=read(),y[i]=read();
if(opt[i]==1) b[++tot]=y[i],b[++tot]=y[i]+1;
}
sort(b+1,b+tot+1);
int k=unique(b+1,b+tot+1)-b-1;
for(int i=1;i<=k;i++) c[i]=rand(),pre[i]=pre[i-1]^c[i];
for(int i=1;i<=n;i++) a[i]=lower_bound(b+1,b+k+1,a[i])-b;
for(int i=1;i<=n;i++) add1(i,a[i]),add2(i,c[a[i]]);
for(int i=1;i<=m;i++)
{
if(opt[i]==1)
y[i]=lower_bound(b+1,b+k+1,y[i])-b,add1(x[i],y[i]-a[x[i]]),add2(x[i],c[y[i]]^c[a[x[i]]]),a[x[i]]=y[i];
else
{
const int kkk=y[i]-x[i];
long long s=(query1(y[i])-query1(x[i]-1))/(kkk+1),l=s-(kkk>>1),r=s+(kkk>>1);
if(kkk&1) r++;
if(l<=0||r>k) puts("yuanxing");
else if((query2(y[i])^query2(x[i]-1))==(pre[r]^pre[l-1])) puts("damushen");
else puts("yuanxing");
}
}
return 0;
}