Time Limit: 1 Sec Memory Limit: 256 MBios
https://vijos.org/p/1659ide
第一行是一個數N(1<=N<=100000),表示人數。ui
接下來的N行,每行一個數,表示排成的序列第i我的和諧值的初始值。spa
接下來是一個數M(1<=M<=100000),表示羊駝國王或他的子民有所活動(羊駝國王選擇一個區間算一次,某區間裏的人增加和諧值算一次)的總次數。ip
接下來的M行,每行第一個是一個數K,K是1或2,若K=1,接下來有三個數L,R,C,表示區間[L,R]的全部人增長C的和諧值;若K=2,接下來有兩個數L,R,表示國王選擇了區間[L,R]。ci
5 1 2 3 4 5 3 2 1 4 1 1 3 3 2 3 5
題意string
題解:it
啊,線段樹,區間更新(加/減),區間查詢最大值io
裸題,拍拍拍class
代碼:
//qscqesze #include <cstdio> #include <cmath> #include <cstring> #include <ctime> #include <iostream> #include <algorithm> #include <set> #include <vector> #include <sstream> #include <queue> #include <typeinfo> #include <fstream> #include <map> typedef long long ll; using namespace std; //freopen("D.in","r",stdin); //freopen("D.out","w",stdout); #define sspeed ios_base::sync_with_stdio(0);cin.tie(0) #define maxn 2000001 #define mod 10007 #define eps 1e-9 //const int inf=0x7fffffff; //無限大 const int inf=0x3f3f3f3f; /* */ //************************************************************************************** int n,q,a[100001]; struct data{ int l,r; long long mx; int tag; }tr[300001]; void build(int k,int s,int t) { tr[k].l=s;tr[k].r=t; if(s==t){tr[k].mx=a[s];return;} int mid=(s+t)>>1; build(k<<1,s,mid); build(k<<1|1,mid+1,t); tr[k].mx=max(tr[k<<1].mx,tr[k<<1|1].mx); } void pushdown(int k) { tr[k<<1].tag+=tr[k].tag; tr[k<<1|1].tag+=tr[k].tag; tr[k<<1].mx+=tr[k].tag; tr[k<<1|1].mx+=tr[k].tag; tr[k].tag=0; } void update(int k,int a,int b,int x) { int l=tr[k].l,r=tr[k].r; if(a==l&&r==b) { tr[k].tag+=x; tr[k].mx+=x; return; } if(tr[k].tag)pushdown(k); int mid=(l+r)>>1; if(b<=mid)update(k<<1,a,b,x); else if(a>mid)update(k<<1|1,a,b,x); else { update(k<<1,a,mid,x); update(k<<1|1,mid+1,b,x); } tr[k].mx=max(tr[k<<1].mx,tr[k<<1|1].mx); } long long ask(int k,int a,int b) { int l=tr[k].l,r=tr[k].r; if(a==l&&b==r){return tr[k].mx;} if(tr[k].tag)pushdown(k); int mid=(l+r)>>1; if(b<=mid)return ask(k<<1,a,b); else if(a>mid)return ask(k<<1|1,a,b); else return max(ask(k<<1,a,mid),ask(k<<1|1,mid+1,b)); } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); build(1,1,n); scanf("%d",&q); for(int i=1;i<=q;i++) { int t,a,b,x; scanf("%d ",&t); if(t==1){ scanf("%d%d%d",&a,&b,&x); update(1,a,b,x); } else{ scanf("%d %d",&a,&b); printf("%lld\n",ask(1,a,b)); } } return 0; }