线段树模版 士兵杀敌3

 
#include<iostream>
#include<stdio.h>
#include<cstdio>
#include<string>
#include<algorithm>

using namespace std;

typedef struct SegTree
{  
    int left,right;
    int amountmax,amountmin;
    struct SegTree *Lchild, *Rchild;  
}SegTreeNode;
int minp,maxp;

SegTree* BuildSegTree(int L,int R)
{
    SegTree *node;
    node=(SegTree *)malloc(sizeof(SegTreeNode));
    node->left=L;
    node->right=R;
    node->amountmax=-1;
    node->amountmin=100000010;
    int M=(L+R)/2;
    if(L==R) node->Rchild=node->Lchild=NULL;    
    else if(L+1==R)
    {
        node->Lchild=BuildSegTree(L,L);
        node->Rchild=BuildSegTree(R,R);
    }
    else
    {
        node->Lchild=BuildSegTree(L,M);        
        node->Rchild=BuildSegTree(M+1,R);
    }
    return node;
}

void InitSegTree(SegTree *root,int initnum,int initamount)
{
    int L=root->left,R=root->right;
    if(L<=initnum&&initnum<=R)
    {
        if(root->amountmax<initamount)  root->amountmax=initamount;
        if(root->amountmin>initamount)  root->amountmin=initamount;
        if(L==R)  return ;
        int M=(R+L)/2;
        if(initnum<=M)  InitSegTree(root->Lchild,initnum,initamount);
        else     InitSegTree(root->Rchild,initnum,initamount);
    }
}

void findm(SegTree *root, int a,int b)
{
    int L=root->left,R=root->right;
    if(a==L&&b==R) 
    {
        if(maxp<root->amountmax) maxp=root->amountmax;
        if(minp>root->amountmin) minp=root->amountmin;
        return ;
    }
    int M=(L+R)/2;
    if(b<=M) findm(root->Lchild,a,b);
    if(M<a)  findm(root->Rchild,a,b);
    if(a<=M&&M<b) 
    {
        findm(root->Lchild,a,M);findm(root->Rchild,M+1,b);
    }
}

int main()
{
    int n,m,i,e;
    scanf("%d%d",&n,&m);
    SegTree *root;
    root=BuildSegTree(1,n);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&e);
        InitSegTree(root,i,e);
    }
    int a,b;
    for(i=1;i<=m;i++)
    {
        minp=100000010;maxp=-1;
        scanf("%d%d",&a,&b);
        findm(root,a,b);
        printf("%d\n",maxp-minp);
    }
    return 0;
}        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值