예제 #1
0
    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;
    }
예제 #2
0
 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;
}