评测记录 基本没什么人跟我wa在同一个地方,调了两天了,实在调不出来,尽力了。。。。 求助大佬
#include<bits/stdc++.h>
using namespace std;
int read()
{
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c-'0'),c=getchar();
return x*f;
}
const int MAXN=3*1e5+10,inf=1e9+10;
int n,m,sum;
int a[MAXN],b[MAXN*2],last[MAXN],cnt,g[MAXN];
map<int,int>mm;
set<int>d[MAXN*2];
int gcd(int x,int y)
{
if(y==0)return x;
return gcd(y,x%y);
}
struct node
{
int g,l,minx,maxn;
}shu[MAXN*4];
void update(int now)
{
// if(shu[now*2].g==0||shu[now*2].g==0)shu[now].g=0;
// else
shu[now].g=gcd(shu[now*2].g,shu[now*2+1].g);
shu[now].l=max(shu[now*2].l,shu[now*2+1].l);
shu[now].minx=min(shu[now*2].minx,shu[now*2+1].minx);
shu[now].maxn=max(shu[now*2].maxn,shu[now*2+1].maxn);
return ;
}
void build(int now,int l,int r)
{
if(l==r)
{
if(g[l]<0)shu[now].g=-g[l];
else shu[now].g=g[l];
shu[now].l=last[l];
shu[now].maxn=shu[now].minx=b[a[l]];
return ;
}
int mid=(l+r)>>1;
build(now*2,l,mid);
build(now*2+1,mid+1,r);
update(now);
}
void change1(int now,int l,int r,int x,int y)
{
if(l==r)
{
shu[now].l=y;
return ;
}
int mid=(l+r)>>1;
if(x<=mid)change1(now*2,l,mid,x,y);
else change1(now*2+1,mid+1,r,x,y);
update(now);
}
void change3(int now,int l,int r,int x,int y)
{
if(l==r)
{
shu[now].minx=shu[now].maxn=y;
return ;
}
int mid=(l+r)>>1;
if(x<=mid)change3(now*2,l,mid,x,y);
else change3(now*2+1,mid+1,r,x,y);
update(now);
}
void change2(int now,int l,int r,int x,int c)
{
if(l==r)
{
if(c<0)shu[now].g=-c;
else shu[now].g=c;
return ;
}
int mid=(l+r)>>1;
if(x<=mid)change2(now*2,l,mid,x,c);
else change2(now*2+1,mid+1,r,x,c);
update(now);
}
void xg(int x,int y)
{
set<int>::iterator it1=d[a[x]].lower_bound(x),it2=it1;
it1++;it2--;
if(it1!=d[a[x]].end())
{
last[*it1]=*it2;
change1(1,1,n,*it1,*it2);
}
if(mm.find(y)==mm.end())
{
mm[y]=++cnt;
b[cnt]=y;
}
d[a[x]].erase(x);
d[mm[y]].insert(x);
it1=d[mm[y]].lower_bound(x);it2=d[mm[y]].upper_bound(x);
if(it2!=d[mm[y]].end())
{
change1(1,1,n,*it2,x);
last[*it2]=x;
}
if(it1!=d[mm[y]].begin())
{
it1--;
change1(1,1,n,x,*it1);
last[x]=*it1;
}
else
{
change1(1,1,n,x,0);
last[x]=0;
}
if(x>1)
{
change2(1,1,n,x,y-b[a[x-1]]);
g[x]=y-b[a[x-1]];
}
else{
change2(1,1,n,x,y);
g[x]=y;
}
if(x+1<=n)
{
change2(1,1,n,x+1,b[a[x+1]]-y);
g[x]=b[a[x+1]]-y;
}
change3(1,1,n,x,y);
a[x]=mm[y];
}
int query1(int now,int l,int r,int x,int y)
{
if(x>y)return 0;
if(l>=x&&r<=y)return shu[now].g;
int mid=(l+r)>>1;
if(x<=mid&&mid<y)return gcd(query1(now*2,l,mid,x,y),query1(now*2+1,mid+1,r,x,y));
if(x<=mid)return query1(now*2,l,mid,x,y);
return query1(now*2+1,mid+1,r,x,y);
}
int query2(int now,int l,int r,int x,int y)
{
if(l>=x&&r<=y)return shu[now].l;
int mid=(l+r)>>1;
int num1=0,num2=0;
if(x<=mid)num1=query2(now*2,l,mid,x,y);
if(mid<y)num2=query2(now*2+1,mid+1,r,x,y);
return max(num1,num2);
}
int query3(int now,int l,int r,int x,int y)
{
if(l>=x&&r<=y)return shu[now].minx;
int mid=(l+r)>>1;
int num1=inf,num2=inf;
if(x<=mid)num1=query3(now*2,l,mid,x,y);
if(mid<y)num2=query3(now*2+1,mid+1,r,x,y);
return min(num1,num2);
}
int query4(int now,int l,int r,int x,int y)
{
if(l>=x&&r<=y)return shu[now].maxn;
int mid=(l+r)>>1;
int num1=0,num2=0;
if(x<=mid)num1=query4(now*2,l,mid,x,y);
if(mid<y)num2=query4(now*2+1,mid+1,r,x,y);
return max(num1,num2);
}
signed main()
{
n=read();m=read();
for(int i=1;i<=n;i++)
a[i]=read(),b[i]=a[i];
for(int i=1;i<=n;i++)
g[i]=a[i]-a[i-1];
sort(b+1,b+1+n);
cnt=unique(b+1,b+1+n)-b-1;
for(int i=1;i<=cnt;i++)
mm[b[i]]=i;
for(int i=1;i<=n;i++)
a[i]=mm[a[i]];
for(int i=1;i<=n;i++)
if(!d[a[i]].empty())
{
last[i]=*(--d[a[i]].end()),d[a[i]].insert(i);
}
else last[i]=0,d[a[i]].insert(i);
build(1,1,n);
for(int i=1;i<=m;i++)
{
int opt;
opt=read();
if(opt==1)
{
int x,y;
x=read();
y=read();
x^=sum;
y^=sum;
xg(x,y);
}
else
{
int l,r,k;
l=read();
r=read();
k=read();
l^=sum;
r^=sum;
k^=sum;
int x,y,xx,yy;
x=query1(1,1,n,l+1,r);y=query2(1,1,n,l,r);
xx=query3(1,1,n,l,r);yy=query4(1,1,n,l,r);
if((k==0&&xx==yy)||(l==r)||(xx+(r-l)*k==yy&&x==k&&y<l))
{
printf("Yes\n");
sum++;
continue;
}
printf("No\n");
}
}
return 0;
}
码风很丑。。。