坑
1.单点修改区间最值
详情请见
->blog.csdn.net/u010598215/article/details/48206959
裸题模板:HDU1745
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=200005;
int n,q;
int h[maxn],s[maxn];
void change(int x)
{
while(x<=n)
{
int lowbit=x&-x;
h[x]=s[x];
for(int i=1;i<lowbit;i<<=1)
h[x]=max(h[x],h[x-i]);
x+=lowbit;
}
}
int query(int x,int y)
{
int res=0;
while(x<=y)
{
res=max(res,s[y]);
y--;
for(;y-(y&-y)>=x;y-=y&-y)
res=max(res,h[y]);
}
return res;
}
int main()
{
while(~scanf("%d%d",&n,&q))
{
memset(h+1,0,sizeof(int)*n);
for(int i=1;i<=n;i++)
scanf("%d",s+i),change(i);
while(q--)
{
char op[2];int a,b;
scanf("%s%d%d",op,&a,&b);
if(op[0]=='U')
{
s[a]=b;
change(a);
}
else printf("%d\n",query(a,b));
}
}
return 0;
}
2.区间修改+区间求和
详情请见->http://m.blog.csdn.net/blackjack_/article/details/74997479
模板裸题(luogu p3372):
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100005;
int n,q;
long long c[2][maxn];
long long read()
{
long long x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9')f=(ch=='-'?-1:1),ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-'0',ch=getchar();
return x*f;
}
void add(long long *tr,int pos,long long val)
{
for(int i=pos;i<=n;i+=i&-i)
tr[i]+=val;
}
void add(int l,int r,long long val)
{
add(c[0],l,val);
add(c[0],r+1,-val);
add(c[1],l,1LL*(l-1)*val);
add(c[1],r+1,1LL*-r*val);
}
long long query(long long *tr,int pos)
{
long long res=0;
for(int i=pos;i;i-=i&-i)
res+=tr[i];
return res;
}
long long query(int l,int r)
{
return 1LL*r*query(c[0],r)-query(c[1],r)-1LL*(l-1)*query(c[0],l-1)+query(c[1],l-1);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
add(i,i,read());
scanf("%d",&q);
while(q--)
{
int op,d1,d2;
long long d;
op=read();
if(op==1)
{
d1=read(),d2=read(),d=read();
add(d1,d2,d);
}
else
{
d1=read();
printf("%lld\n",query(d1,d1));
}
}
}