void upd(node* t){
    if(t == NULL)
        return;
    t->sz = 1 + sz(t->l) + sz(t->r);
    t->sum = t->v + sum(t->l) + sum(t->r);
    t->tr = comp(get_tr(t->l), comp(mkQuad(t->v), get_tr(t->r)));
}
Exemple #2
0
static struct TrackedResources * CopyResourcesState(const struct TrackedResources *src)
{
    struct TrackedResources *tr;
    struct OpenedResourceNode *orn;

    tr = get_tr();
    if (!tr)
	return NULL;

    /* opencount-based stuff */
    NEWLIST(&tr->opened);

    for(orn=(struct OpenedResourceNode *)src->opened.lh_Head;
        orn->node.ln_Succ!=NULL;
        orn=(struct OpenedResourceNode *)orn->node.ln_Succ)
    {
	struct OpenedResourceNode *nc;

	nc = CopyResourcesNode(orn);
	Enqueue(&tr->opened, (struct Node *)nc);
    }

    /* memory */
    tr->freeMem = src->freeMem;

    return tr;
}
int main(){
    int n;
    scanf("%d", &n);
    for(int i=0; i<n; i++){
        int a;
        scanf("%d", &a);
        inc(a);
        quad x = get_tr(treap);
        ll ans = (x.first.first + x.first.second) % MOD;
        printf("%lld\n", ans);
    }
}
Exemple #4
0
/* Get a snapshot of current resources */
static struct TrackedResources *NewResourcesState(void)
{
    struct TrackedResources *tr;

    tr = get_tr();
    if (!tr)
	return NULL;

    /* flush */
    FreeVec(AllocVec(~0ul/2, MEMF_ANY));

    /* opencount-based stuff */
    NEWLIST(&tr->opened);
    if (!AddOpenedResources(&tr->opened))
	return NULL;

    /* memory */
    tr->freeMem = AvailMem(MEMF_ANY);

    return tr;
}