Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- int const N2 = 500010;
- typedef long long int ll;
- int n;
- ll maxtree[N2];
- ll sumtree[N2];
- ll max(ll a,ll b){
- return (a > b ? a : b);
- }
- ll buildmax(int I){
- if(I >= n*2)return -1e18;
- if(I >= n)return maxtree[I];
- return maxtree[I] = max(buildmax(I*2),buildmax(I*2 + 1));
- }
- ll buildsum(int I){
- if(I >= n*2)return 0;
- if(I >= n)return sumtree[I];
- return sumtree[I] = buildsum(I*2) + buildsum(I*2 + 1);
- }
- ll qmax(int L,int R){
- L += n - 1;
- R += n - 1;
- ll maxa = max(maxtree[L],maxtree[R]);
- while(L <= R){
- if(L % 2 == 1){
- maxa = max(maxa , maxtree[L++]);
- }
- if(R % 2 == 0){
- maxa = max(maxa , maxtree[R--]);
- }
- L/=2;
- R/=2;
- }
- return maxa;
- }
- /*
- ll qsum(int L,int R){
- L += n - 1;
- R += n - 1;
- ll suma = 0;
- while(L <= R){
- if(L % 2 == 1){
- suma += sumtree[L++];
- }
- if(R % 2 == 0){
- suma += sumtree[R--];
- }
- L/=2;
- R/=2;
- }
- return suma;
- }
- */
- ll qs[100010];
- int main()
- {
- int m;
- scanf("%d %d",&n,&m);
- for(int i = 0 ; i < n ; i ++){
- scanf("%lld",&maxtree[i+n]);
- }
- for(int i = 1 ; i <= n ; i ++){
- scanf("%lld",&qs[i]);
- qs[i] = qs[i-1] + qs[i];
- }
- buildmax(1);
- for(int i = 0 ; i < m ; i ++){
- int L,R;
- scanf("%d %d",&L,&R);
- L++;
- R++;
- // printf("%lld %lld\n",qmax(L,R),qsum(L,R));
- printf("%lld %lld\n",qmax(L,R),qs[R] - qs[L-1]);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment