PKU3264线段树解法

#include<stdio.h>
#include
<string.h>


struct node
{
    node 
* pl, * pr;
    
int left, right;
    
int mxa, min;
}
mem[100000];

int memCount;
int n, q;
int mxa, min;

node 
* newNode()
{
    node 
* pt=&mem[memCount++];
    pt
->mxa=-1, pt->min=1000001;
    
return pt;
}


node 
* buildTree(int l, int r)
{
    node 
* root=newNode();
    root
->left=l;
    root
->right=r;
    
if(r-l>=1)
    
{
        
int mid=(l+r)/2;
        root
->pl=buildTree(l,mid);
        root
->pr=buildTree(mid+1,r);
    }

    
return root;
}


void update(node * root, int i, int a)
{
    
if(root->left==&& root->right==i)
    
{
        root
->mxa=a, root->min=a;
        
return ;
    }

    
if(root->min>a)
        root
->min=a;
    
if(root->mxa<a)
        root
->mxa=a;

    
if(root->pl->right>=i)
    
{
        update(root
->pl,i,a);
    }
else
    
{
        update(root
->pr,i,a);
    }

}


void que(node * root, int i, int j)
{
    
if(root->min>min && root->mxa<mxa)
        
return;
    
if(root->left==&& root->right==j)
    
{
        
if(mxa<root->mxa)
            mxa
=root->mxa;
        
if(min>root->min)
            min
=root->min;
        
return;
    }

    
if(root->pl->right>=i)
    
{
        
if(root->pl->right>=j)
            que(root
->pl, i, j);
        
else
        
{
            
int mid=(root->left+root->right)/2;
            que(root
->pl,i,mid);
            que(root
->pr,mid+1,j);
        }

    }
else
    
{
        que(root
->pr,i,j);
    }

}


int main()
{

    
while(scanf("%d%d"&n, &q)==2)
    
{
        memCount
=0;
        node 
* root=buildTree(1, n);
        
int i, a;
        
for(i=0;i<n;i++)
        
{
            scanf(
"%d",&a);
            update(root,i
+1,a);
        }

        
int x, y;
        
for(i=0;i<q;i++)
        
{
            scanf(
"%d%d"&x, &y);
            mxa
=-1, min=1000001;
            que(root,x, y);
            printf(
"%d\n",mxa-min);
        }

    }

    
return  0;
}
原文地址:https://www.cnblogs.com/SQL/p/932354.html