卿学姐视频中的例题。
https://www.bilibili.com/video/av6445624/?from=search&seid=12002045742961898917
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 1e5+10;
LL num[MAXN],Max[MAXN];
int belong[MAXN],l[MAXN],r[MAXN];
int block,n,q,ix;
LL res;
void build()
{
block = sqrt(n);
ix = n/block;
if(n%block) ix++;
for(int i = 1; i <= ix; ++i)
{
l[i] = (i-1)*block+1;
r[i] = i*block;
}
r[ix] = n;
for(int i = 1; i <= n; ++i)
belong[i] = (i-1)/block+1;
for(int i = 1; i <= ix; ++i)
{
for(int j = l[i]; j <= r[i]; ++j)
Max[i] = max(Max[i],num[j]);
}
}
void update(int pos, int attack)
{
num[pos] += attack;
Max[belong[pos]] = max(Max[belong[pos]],num[pos]);
}
LL ask(int le, int re)
{
res = 0;
if(belong[le] == belong[re])
{
for(int i = le; i <= re; ++i)
res = max(res,num[i]);
return res;
}
for(int i = le; i <= r[belong[le]]; ++i)
res = max(res,num[i]);
for(int i = belong[le]+1; i < belong[re]; ++i)
res = max(res,Max[i]);
for(int i = l[belong[re]]; i <= re; ++i)
res = max(res,num[i]);
return res;
}
int main()
{
scanf("%d %d",&n,&q);
build();
int op,le,re;
while(q--)
{
scanf("%d %d %d",&op,&le,&re);
if(op == 1) update(le,re);
else printf("%lld\n",ask(le,re));
}
}