hdu 3308 LCIS(线段树区间合并)

2014-11-23 23:30:15 · 作者: · 浏览: 6
题意:给一个序列,有两种操作,Q:询问x到y的LCIS长度。U:将序号为x的值改为y。
思路:用线段树来维护序列,每次更改值时就更新树,查询是很快的,查询时要注意。
#include  
#include  
const int N=100100;  
int a[N];  
struct Tree  
{  
    int L,R,ml;  
    int Ll,Rl,Ln,Rn;  
    //ml区间的LCIS长度  
    //Ll,Rl区间左边右边的LCIS长度  
    //Ln,Rn区间左右的值  
}T[N*3];  
int max(int a,int b)  
{  
    if(a>b)return a;  
    return b;  
}  
int min(int a,int b)  
{  
    if(a>1,li=id<<1,ri=li+1;  
    buildTree(L,mid,id<<1);  
    buildTree(mid+1,R,id<<1|1);  
    T[id].Ln=T[li].Ln;T[id].Rn=T[ri].Rn;  
    T[id].Ll=T[li].Ll;T[id].Rl=T[ri].Rl;  
    T[id].ml=max(T[li].ml,T[ri].ml);  
    if(T[li].Rn
>1,li=id<<1,ri=li+1; if(LR<=mid)insert(LR,w,li); else insert(LR,w,ri); T[id].Ln=T[li].Ln;T[id].Rn=T[ri].Rn; T[id].Ll=T[li].Ll;T[id].Rl=T[ri].Rl; T[id].ml=max(T[li].ml,T[ri].ml); if(T[li].Rn>1,li=id<<1,ri=li+1; if(mid>=R) return query(L,R,li); else if(mid