G.Pot

区间加 , 区间最值

#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 ;
}

posted @ 2019-12-02 17:43  spnooyseed  阅读(205)  评论(0编辑  收藏  举报