WA9 15pts 求调
#include<bits/stdc++.h>
using namespace std;
int n,q;
int a[6000010],f[6000010];
int mn[6000010],ab[6000010];
int las,nex[6000010],val[6000010],tag[6000010];
int find(int x)
{
if(x!=f[x])
{
f[x]=find(f[x]);
return f[x];
}
return x;
}
int main()
{
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
f[i]=i;
if(a[i]>=mn[i-1])
{
mn[i]=a[i];
ab[i]=i;
val[i]=mn[i];
nex[i]=-1;
nex[las]=i;
las=i;
}
else
{
mn[i]=mn[i-1];
ab[i]=ab[i-1];
f[i]=f[i-1];
}
}
int op,x,y;
while(q--)
{
scanf("%d%d%d",&op,&x,&y);
if(op==1)
{
int fx=find(x),sum=0;
tag[fx]+=y;
sum=tag[fx];
for(int i=nex[fx];;i=nex[i])
{
nex[fx]=i;
if(i==-1||val[i]>=val[fx]+sum) break;
sum+=tag[i];
f[i]=f[fx];
}
}
else
{
int num=ab[find(y)];
if(x<=num&&num<=y)
{
printf("0\n");
}
else
{
printf("%d\n",x-num);
}
}
}
return 0;
}