Example #1
0
/*buddy_alloc_pages - alloc n page from free area and return the first page.
 *	                  The header page should set page property flag, and the
 *					  property field should assign to n which means next 
 *					  follow n pages has been allocated.
 */
struct Page* buddy_alloc_pages(size_t n){
	assert(n > 0);
	if(n > nr_free){
		return NULL;
	}
	struct Page* page = NULL;
	uint8_t o = get_ord(n * MIN_BLOCK);
	uint32_t i = 0;
	while(1){
		if( lft(mem[i]) >= o )
			i = lc(i);
		else if( rht(mem[i]) >= o )
			i = rc(i);
		else
			break;
	}	
	if( o == ord(mem[i]) ){
		set_rht(mem[i], 0);
		set_lft(mem[i], 0);
		page = buddy2page(mem[i], i);
		assert(!PageReserved(page));
		SetPageProperty(page);
		nr_free -= page->property = 1 << (ord(mem[i]) - 2);
		update(i);
	}
	return page;
}
int main(){
    scanf("%d%d",&N,&M);
    for(int i=0,a;i<N;++i){
        scanf("%d",&a);
        mrg(rt,rt,new nd(a));
    }
    for(int i=0,a,b,c;i<M;++i){
        scanf("%d%d%d",&a,&b,&c);
        nd *l=0,*m=0,*r=0;
        spt(rt,m,r,c);
        spt(m,l,m,b-1);
        if(a==1){
            mrg(m,m,l); 
            mrg(rt,m,r);
        }else{
            mrg(m,r,m);
            mrg(rt,l,m);
        }
    }
    printf("%d\n",abs(rht(rt)-lft(rt)));
    dfs(rt);
}
int rht(nd *n){
    if(!n->r) return n->val;
    else return rht(n->r);
}