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