/*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); }