区间加 , 区间最值
#include <bits/stdc++.h>
#pragma GCC optimize(3 , "Ofast" , "inline")
using namespace std;
typedef long long ll ;
const int INF = 0x3f3f3f3f , N = 1e5 + 10 ; void read(int &x)
{
x = 0 ;
char c = getchar() ;
while(!isdigit(c)) c = getchar() ;
while(isdigit(c)) x = x * 10 + c - 48 , c = getchar() ;
}
int n , q ; struct node
{
int l , r , sum , tag ;
}tree2[N << 2] , tree3[N << 2] , tree5[N << 2] , tree7[N << 2]; void build(int l , int r , int rt , node *a)
{
a[rt].l = l , a[rt].r = r , a[rt].sum = a[rt].tag = 0 ;
if(l == r)
return ;
int mid = l + r >> 1 ;
build(l , mid , rt << 1 , a) , build(mid + 1 , r , rt << 1 | 1 , a) ;
}
void push_down(int rt , node *a)
{
if(a[rt].l == a[rt].r)
{
a[rt].tag = 0 ;
return ;
}
a[rt << 1].sum += a[rt].tag ;
a[rt << 1 | 1].sum += a[rt].tag ;
a[rt << 1].tag += a[rt].tag ;
a[rt << 1 | 1].tag += a[rt].tag ;
a[rt].tag = 0 ;
}
void update(int l , int r , int rt ,int k , node *a)
{
if(l == a[rt].l && r == a[rt].r)
{
a[rt].sum += k ;
a[rt].tag += k ;
return ;
}
if(a[rt].tag) push_down(rt , a) ;
int mid = a[rt].l + a[rt].r >> 1 ;
if(r <= mid) update(l , r , rt << 1 , k , a) ;
else if(l > mid) update(l , r , rt << 1 | 1 , k , a) ; else
{
update(l , mid , rt << 1 , k , a) ;
update(mid + 1 ,r , rt << 1 | 1 , k , a) ;
}
a[rt].sum = max(a[rt << 1].sum , a[rt << 1 | 1].sum) ;
}
int query(int l , int r , int rt ,node *a)
{
if(a[rt].tag) push_down(rt , a) ;
if(l == a[rt].l && r == a[rt].r)
return a[rt].sum ;
int mid = a[rt].l + a[rt].r >> 1 ;
if(r <= mid) return query(l , r ,rt << 1 , a) ;
else if(l > mid) return query(l , r , rt << 1 | 1 , a) ;
else return max(query(l , mid , rt << 1 , a) , query(mid + 1 , r , rt << 1 | 1 , a)) ;
}
int main()
{
read(n) , read(q) ;
build(1 , n , 1 , tree2) , build(1 , n , 1 , tree3) , build(1 , n , 1 , tree5) , build(1 , n , 1 , tree7) ;
for(int i = 1; i <= q; i ++)
{
char s[20] ;
int l , r , x ;
scanf("%s" , s) ;
read(l) , read(r) ; if(s[1] == 'A')
{
int max1 = max(query(l , r , 1 , tree2) ,query(l , r , 1 , tree3) ) ;
int max2 = max(query(l , r , 1 , tree5) ,query(l , r , 1 , tree7) ) ;
printf("ANSWER %d\n" , max(max1 , max2)) ;
}
else
{
read(x) ;
if(x == 2) update(l , r , 1 , 1 , tree2) ;
else if(x == 3) update(l , r , 1 , 1 , tree3) ;
else if(x == 4) update(l , r , 1 , 2 , tree2) ;
else if(x == 5) update(l , r , 1 , 1 , tree5) ;
else if(x == 6) update(l , r , 1 , 1 , tree2) , update(l , r , 1 , 1 , tree3) ;
else if(x == 7) update(l , r , 1 , 1 , tree7) ;
else if(x == 8) update(l , r , 1 , 3 , tree2) ;
else if(x == 9) update(l , r , 1 , 2 , tree3) ;
else if(x == 10) update(l , r , 1 , 1 , tree2) , update(l , r , 1 , 1 , tree5) ;
}
}
return 0 ;
}