#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=1e5+5;
int sum[4*N],lsum[4*N],rsum[4*N],a[N];//连续的上升序列,考试的时候没看清题就做了
int n,m;
void pushdown(int k,int l,int r)
{
lsum[k]=lsum[2*k];
rsum[k]=rsum[2*k+1];
int mid=(l+r)/2;
sum[k]=max(sum[2*k],sum[2*k+1]);
if (a[mid]<a[mid+1])
{
if (lsum[2*k]==mid-l+1)
{
lsum[k]=lsum[2*k]+lsum[2*k+1];
}
if (rsum[2*k+1]==r-mid)
{
rsum[k]=rsum[2*k]+rsum[2*k+1];
}
sum[k]=max(sum[k],rsum[2*k]+lsum[2*k+1]);
}
}
void update(int k,int l,int r,int x,int v)
{
if(l==r)
{
a[l]=v;
return;
}
int mid=(l+r)/2;
if(x<=mid)
update(2*k,l,mid,x,v);
else
update(2*k+1,mid+1,r,x,v);
pushdown(k,l,r);
}
int query(int k,int l,int r,int x,int y)
{
if (l>=x&&r<=y)
return sum[k];
int mid=(r+l)/2;
int res=0;
if (x<=mid)
res=max(res,query(2*k,l,mid,x,y));
if (y>mid)
res=max(res,query(2*k+1,mid+1,r,x,y));
return res;
}
void build(int k,int l,int r)
{
if (l==r)
{
sum[k]=lsum[k]=rsum[k]=1;
return;
}
int mid=(l+r)/2;
build(2*k,l,mid);
build(2*k+1,mid+1,r);
pushdown(k,l,r);
}
int main()
{
int x,y,ans;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
build(1,1,n);
printf("%d\n",query(1,1,n,1,n));
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
update(1,1,n,x,y);
printf("%d\n",query(1,1,n,1,n));
}
return 0;
}
林大 1499
最新推荐文章于 2024-01-07 21:12:08 发布