// http://www.spoj.com/problems/RMQSQ/
#include<iostream>
using namespace std;
int arr[100000];
int tree[100000];
int laz[1000000];
#define inf 999999999
int query(int node,int start,int end,int r1,int r2)
{
// cout<<start<<" "<<end<<endl;
if(start>end || r1>end || r2<start) return inf;
if(laz[node])
{
tree[node]+=laz[node];
laz[2*node]+=laz[node];
laz[2*node+1]+=laz[node];
laz[node]=0;
}
if(r1<=start && r2>=end)
{
return tree[node];
}
else
{
int q1=query(2*node,start,(start+end)/2,r1,r2);
int q2=query(2*node+1,((start+end)/2)+1,end,r1,r2);
return min(q1,q2);
}
}
void update(int node ,int start,int end,int r1,int r2,int val)
{
if(r1>end || r2<start || start>end) return ;
if(laz[node]!=0)
{
tree[node]+=laz[node];
laz[2*node+1]+=laz[node];
laz[2*node]+=laz[node];
laz[node]=0;
}
if(r1<=start && r2>=end)
{
tree[node]+=val;
if(start!=end)
{
laz[2*node]+=val;
laz[2*node+1]+=val;
}
return ;
}
update(2*node, start,(start+end)/2,r1,r2,val);
update(2*node+1, ((start+end)/2)+1,end,r1,r2,val);
tree[node]=min(tree[2*node],tree[2*node+1]);
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>arr[i];
build(1,0,n-1);
// for(int i=0;i<20;i++) cout<<i<<" "<<tree[i]<<endl;
int q;
cin>>q;
while(q--)
{
int ip;
cin>>ip;
if(ip==0)
{
int r1,r2,val;
cin>>r1>>r2>>val;
update(1,0,n-1,r1,r2,val);
}
else
{
int r1,r2;
cin>>r1>>r2;
int res= query(1,0,n-1,r1,r2);
cout<<res<<endl;
}
}
return 0;
}
#include<iostream>
using namespace std;
int arr[100000];
int tree[100000];
int laz[1000000];
#define inf 999999999
int query(int node,int start,int end,int r1,int r2)
{
// cout<<start<<" "<<end<<endl;
if(start>end || r1>end || r2<start) return inf;
if(laz[node])
{
tree[node]+=laz[node];
laz[2*node]+=laz[node];
laz[2*node+1]+=laz[node];
laz[node]=0;
}
if(r1<=start && r2>=end)
{
return tree[node];
}
else
{
int q1=query(2*node,start,(start+end)/2,r1,r2);
int q2=query(2*node+1,((start+end)/2)+1,end,r1,r2);
return min(q1,q2);
}
}
void update(int node ,int start,int end,int r1,int r2,int val)
{
if(r1>end || r2<start || start>end) return ;
if(laz[node]!=0)
{
tree[node]+=laz[node];
laz[2*node+1]+=laz[node];
laz[2*node]+=laz[node];
laz[node]=0;
}
if(r1<=start && r2>=end)
{
tree[node]+=val;
if(start!=end)
{
laz[2*node]+=val;
laz[2*node+1]+=val;
}
return ;
}
update(2*node, start,(start+end)/2,r1,r2,val);
update(2*node+1, ((start+end)/2)+1,end,r1,r2,val);
tree[node]=min(tree[2*node],tree[2*node+1]);
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>arr[i];
build(1,0,n-1);
// for(int i=0;i<20;i++) cout<<i<<" "<<tree[i]<<endl;
int q;
cin>>q;
while(q--)
{
int ip;
cin>>ip;
if(ip==0)
{
int r1,r2,val;
cin>>r1>>r2>>val;
update(1,0,n-1,r1,r2,val);
}
else
{
int r1,r2;
cin>>r1>>r2;
int res= query(1,0,n-1,r1,r2);
cout<<res<<endl;
}
}
return 0;
}
No comments:
Post a Comment