poj3264 线段树水题

之前青岛市的一个比赛有题线段树,结果自己实在太二,用线段树去敲没想到自己哪儿错了。。。

结果今天回来一做一道求最值的水题就发现自己的错误了。。。。导致那场比赛呗虐啊。。。。

 

#include<iostream>
#include<cstdio>
using namespace std;
const int inf =1<<30;
struct segtree
{
    int l;
    int r;
    int mid;
    int max;
   // int sum;
    int min;
}T[600011];


int max(int a,int b)
{
    return a>b?a:b;
}
int min(int a,int b)
{
    return a<b?a:b;
}


void construct(int l,int r,int k)  //二叉树
{
    T[k].l=l;
    T[k].r=r;
    T[k].mid=(l+r)/2;
    T[k].max=-1;
    T[k].min=inf;
    //T[k].sum=0;


    if(l==r)    return ;

    construct(l,T[k].mid,2*k);
    construct(T[k].mid+1,r,2*k+1);
}


void insert(int n,int d,int k)
{
    if(T[k].l==T[k].r&&T[k].l==d)   {T[k].max=n;T[k].min=n;return ;}
    //if(T[k].l==T[k].r&&T[k].l==d)   {T[k].sum+=n;return ;}

    if(d<=T[k].mid)  insert(n,d,2*k);
    else            insert(n,d,2*k+1);
    {
        T[k].max=max(T[2*k].max,T[2*k+1].max);
        T[k].min=min(T[2*k].min,T[2*k+1].min);
    }
}


int ans;int ans1;
void search(int l,int r,int k)              //类似深搜
{
    if(T[k].l==l&&T[k].r==r)    {ans=max(ans,T[k].max);ans1=min(ans1,T[k].min);return ;}
    //if(T[k].l==l&&T[k].r==r)    {ans+=T[k].sum;return ;}

    if(r<=T[k].mid)      search(l,r,2*k);
    else if(l>T[k].mid)  search(l,r,2*k+1);
    else
    {
        search(l,T[k].mid,2*k);
        search(T[k].mid+1,r,2*k+1);
    }
}


int main()
{
    int N,Q;
    cin>>N>>Q;
    construct(1,N,1);
    for(int i=1;i<=N;i++)
    {
        int v;
        scanf("%d",&v);
        insert(v,i,1);
    }
    while(Q--)
    {
        int v,w;
        ans=-1;ans1=inf;
        scanf("%d%d",&v,&w);
        search(v,w,1);
        cout<<ans-ans1<<endl;
    }
    return 0;
}


 

posted @ 2013-05-28 19:56  amourjun  阅读(120)  评论(0编辑  收藏  举报