某只蒟蒻的记录
某个难倒蒟蒻的题目
#include<bits/stdc++.h>
#define left 2*x
#define right 2*x+1
using namespace std;
int n,q,a[200005],u,v,w;
char c;
struct str{
int val1,val2,lazy1,lazy2;
bool mak1;
}tree[200005];
inline void build(int x,int l,int r)
{
tree[x].lazy1=0x7f7f7f7f;
tree[x].lazy2=0;
if(l==r)
{
tree[x].val1=tree[x].val2=a[x];
return ;
}
int mid=(l+r)>>1;
build(left,l,mid);
build(right,mid+1,r);
tree[x].val1=min(tree[left].val1,tree[right].val1);
tree[x].val2=tree[left].val2+tree[right].val2;
}
inline void push_down1(int x,int l,int r)
{
if(tree[x].mak1&&l!=r)
{
tree[left].val1=tree[x].lazy1;
tree[left].lazy1=tree[x].lazy1;
tree[left].mak1=true;
tree[right].val1=tree[x].lazy1;
tree[right].lazy1=tree[x].lazy1;
tree[right].mak1=true;
tree[x].val1=0x7f7f7f7f;
tree[x].mak1=false;
}
}
inline void push_down2(int x,int l,int r)
{
if(tree[x].lazy2&&l!=r)
{
tree[left].val2=tree[x].lazy2;
tree[left].lazy2=tree[x].lazy2;
tree[right].val2=tree[x].lazy2;
tree[right].lazy2=tree[x].lazy2;
tree[x].lazy2=0;
}
}
inline int ask1(int x,int l,int r,int ql,int qr)
{
if(l<=ql&&r>=qr) return tree[x].val1;
push_down1(x,l,r);
int mid=(ql+qr)>>1;
if(r<=mid) return ask1(left,l,mid,ql,qr);
else if(l>mid) return ask1(right,mid+1,r,ql,qr);
else
{
int lmin=ask1(left,l,mid,ql,mid);
int rmin=ask1(right,mid+1,r,mid+1,qr);
return min(lmin,rmin);
}
}
inline int ask2(int x,int l,int r,int ql,int qr)
{
if(l<=ql&&qr<=r) return tree[x].val2;
push_down2(x,l,r);
int mid=(ql+qr)>>1;
if(r<=mid) return ask2(left,l,mid,ql,qr);
else if(l>mid) return ask2(right,mid+1,r,ql,qr);
else
{
int lsum=ask2(left,l,mid,ql,mid);
int rsum=ask2(right,mid+1,r,mid+1,qr);
return lsum+rsum;
}
}
inline void change(int x,int l,int r,int ql,int qr,int k)
{
if(l<=ql&&qr<=r)
{
tree[x].val1+=k;
tree[x].lazy1+=k;
tree[x].mak1=true;
tree[x].val2+=k;
tree[x].lazy2+=k;
return ;
}
push_down1(x,l,r);
push_down2(x,l,r);
int mid=(ql+qr)>>1;
if(l<=mid) change(left,l,mid,ql,qr,k);
else if(r>mid) change(right,mid+1,r,ql,qr,k);
tree[x].val1=min(tree[left].val1,tree[right].val1);
tree[x].val2=tree[right].val2+tree[left].val2;
return ;
}
int main()
{
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
build(1,1,n);
for(int i=1;i<=q;i++)
{
cin>>c;
if(c=='M')
{
scanf("%d%d",&u,&v);
printf("%d\n",ask1(1,1,n,u,v));
}
else if(c=='S')
{
scanf("%d%d",&u,&v);
printf("%d\n",ask2(1,1,n,u,v));
}
else
{
scanf("%d%d%d",&u,&v,&w);
change(1,1,n,u,v,w);
}
}
return 0;
}