区间加,区间求min
代码:
#include <bits/stdc++.h>
using namespace std;
int n,m,p,ad[4000005],s[4000005];
void add(int k,int l,int r,int v)
{
ad[k] += v;
s[k] += v * (r - l + 1);
}
void pd(int k,int l,int r,int mid)
{
if(ad[k] == 0)
{
return;
}
add(k * 2,l,mid,ad[k]);
add(k * 2 + 1,mid + 1,r,ad[k]);
ad[k] = 0;
}
int query(int k,int l,int r,int x,int y)
{
if(l >= x && r <= y)
{
return s[k];
}
int mid = (l + r) / 2,ans = 2e9;
pd(k,l,r,mid);
if(x <= mid)
{
ans = min(ans,query(k * 2,l,mid,x,y));
}
if(mid < y)
{
ans = min(ans,query(k * 2 + 1,mid + 1,r,x,y));
}
return ans;
}
void mdf(int k,int l,int r,int x,int y,int v)
{
if(l >= x && r <= y)
{
return add(k,l,r,v);
}
int mid = (l + r) / 2;
pd(k,l,r,mid);
if(x <= mid)
{
mdf(k * 2,l,mid,x,y,v);
}
if(mid < y)
{
mdf(k * 2 + 1,mid + 1,r,x,y,v);
}
s[k] = min(s[k * 2],s[k * 2 + 1]);
}
int main()
{
scanf("%d%d%d",&n,&m,&p);
m += p;
while(m--)
{
int f,x,y;
scanf("%d%d%d",&f,&x,&y);
if(f == 1)
{
mdf(1,1,n,x,y,1);
}
else
{
printf("%d\n",query(1,1,n,x,y));
}
}
return 0;
}
死活调不出来了,请求帮助,拜谢!