线段树的结点更新

http://acm.hdu.edu.cn/showproblem.php?pid=4217

 

线段树的结点更新 View Code
#include<stdio.h>



struct data

{

    int l,r;

    int sum;

}node[1962144];



void build(int ll,int rr,int n)

{

    node[n].l=ll;

    node[n].r=rr;

    node[n].sum=rr-ll+1;

    if(ll==rr)return ;

    int mid=(ll+rr)>>1;

    build(ll,mid,n+n);

    build(mid+1,rr,n+n+1);

}



int point;

void search(int n,int temp)

{

    if(node[n].l==node[n].r){

        point=node[n].l;

        node[n].sum--;

        return;

    }

    

    if(temp<=node[n+n].sum)

    {

        search(n+n,temp);

    }else

    {

        search(n+n+1,temp-node[n+n].sum);

    }

    node[n].sum--;

}



int main()

{

    int t,T=0;

    scanf("%d",&t);

    while(t--)

    {

        int n,m;

        scanf("%d%d",&n,&m);



        build(1,n,1);



        int i,temp;

        __int64 all=0;

        for(i=1;i<=m;i++)

        {

            scanf("%d",&temp);

            search(1,temp);

            all+=point;

        }

        printf("Case %d: ",++T);

        printf("%I64d\n",all);

    }



    return 0;

}

你可能感兴趣的:(线段树)