本文主要是介绍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 ;
}
这篇关于G.Pot的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!