http://acm.uestc.edu.cn/problem.php?pid=1393
线段树,RMQ。
#include<stdio.h>
#include<string.h>
#define maxn 800080
#define MAX 0x7fffffff
__int64 sum[maxn];
__int64 col[maxn];
__int64 MIN(__int64 a, __int64 b)
{
return a>b?b:a;
}
void Pushup(int rt)
{
sum[rt]=MIN(sum[rt<<1],sum[rt<<1|1]);
}
void buildtree(int l,int r,int rt)
{
col[rt]=0;
if(l==r)
{
scanf("%I64d",&sum[rt]);
return ;
}
int mid=(l+r)/2;
buildtree(l,mid,rt<<1);
buildtree(mid+1,r,rt<<1|1);
Pushup(rt);
}
void Pushdown(int rt)
{
if(col[rt])
{
col[rt<<1]+=col[rt];
col[rt<<1|1]+=col[rt];
sum[rt<<1]+=col[rt];
sum[rt<<1|1]+=col[rt];
col[rt]=0;
}
}
void Update(int L,int R,__int64 c,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
col[rt]+=c;
sum[rt]+=c;
return ;
}
Pushdown(rt);
int mid=(l+r)/2;
if(L<=mid) Update(L,R,c,l,mid,rt<<1);
if(R>mid) Update(L,R,c,mid+1,r,rt<<1|1);
Pushup(rt);
}
__int64 Query(int L,int R,int l,int r,int rt)
{
__int64 ret=MAX;
if(L<=l&&r<=R)
return sum[rt];
Pushdown(rt);
int mid=(l+r)>>1;
if(L<=mid) ret=MIN(ret,Query(L,R,l,mid,rt<<1));
if(R>mid) ret=MIN(ret,Query(L,R,mid+1,r,rt<<1|1));
return ret;
}
int main()
{
int n,m;
int a,b;
__int64 c;
char str[50];
scanf("%d",&n);
buildtree(1,n,1);
scanf("%d",&m);
getchar();
while(m--)
{
gets(str);
if(3==sscanf(str,"%d %d %I64d",&a,&b,&c))
{
if(a>b)
{
Update(1,b+1,c,1,n,1);
Update(a+1,n,c,1,n,1);
}
else
Update(a+1,b+1,c,1,n,1);
}
else
{
__int64 mm=0;
if(a>b)
mm=MIN(Query(1,b+1,1,n,1),Query(a+1,n,1,n,1));
else
mm=Query(a+1,b+1,1,n,1);
printf("%I64d\n",mm);
}
}
return 0;
}