NoAVL<T>* simp_roda_dir(NoAVL<T>* k2) { NoAVL<T>* k1; k1 = k2->getDireita(); k2->direita = k1->getEsquerda(); k1->esquerda = k2; k2->height = maX(altura(k2->getDireita()), altura(k2->getEsquerda()))+1; k1->height = maX(altura(k1->getDireita()), k2->height)+1; return k1; }
void atualizarAltura(NoAVL<T>* arv) { int m,n,d; m = altura(arv->getEsquerda()); n = altura(arv->getDireita()); d = maX(m,n); arv->height = d + 1; }
long long query( int node, int left, int right) { if ( start[node] == finish[node] ) { return value[node]; } if ( left == start[node] && right == finish[node] ) { return value[node]; } long long result = 0l; if ( left <= middle[node] ) { result += query(node*2, left, miN(middle[node], right)); } if ( right >= middle[node] +1 ) { result += query(node*2+1, maX(left, middle[node]+1), right); } return result; }
long long setV(int node, int left, int right, int v) { long long change; if ( start[node] == finish[node] ) { arr[start[node]-1] = v; change = value[node]; value[node] = (long long)(v); value[node] *= value[node]; return -change + value[node]; } change = 0l; if ( left <= middle[node]) { change += setV(node*2, left, miN(middle[node], right), v ); } if ( right >= middle[node] +1 ) { change += setV(node*2+1, maX(middle[node]+1 , left),right, v ); } value[node] += change; return change; }