Cod sursa(job #756315)

Utilizator XladhenianGrigorita Vlad-Stefan Xladhenian Data 9 iunie 2012 14:47:45
Problema Arbori indexati binar Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.41 kb

#include <fstream>
using namespace std;

struct TNod;
typedef TNod *PNod;
struct TNod
{
 long val;
 long left,right,mid;
 PNod L,R;
};

long N,M;
long A[100005];
PNod Frunze[100005];

PNod T;

PNod CreazaNod(long left,long right)
{
 PNod r = new TNod;
 r->left = left;
 r->right = right;
 r->mid = left + ((right - left) >> 1);
 r->L = 0;
 r->R = 0;
 if (r->left == r->right)
   {
    r->val = A[left];
    Frunze[left] = r;
   }
  else
   {
    r->val = -1;
   }
 return r;
}

PNod ConstruiesteArbore(long left,long right)
{
 PNod R = CreazaNod(left,right);
 if (R->val < 0)
   {
    R->L = ConstruiesteArbore(left,R->mid);
    R->R = ConstruiesteArbore(R->mid + 1,right);
   }
 return R;
}

long ComputeSum(PNod r)
{
 if (r->val < 0)
   {
    r->val = ComputeSum(r->L) + ComputeSum(r->R);
   }
 return r->val;
}

long AflaSum(PNod r,long a,long b)
{
 if ((a == r->left) && (b == r->right))
   {
    return r->val;
   }
 if (a > r->mid)
   {
    return AflaSum(r->R,a,b);
   }
 if (b <= r->mid)
   {
    return AflaSum(r->L,a,b);
   }
 if ((r->left <= a) && (b <= r->right))
   {
    return AflaSum(r->L,a,r->mid) + AflaSum(r->R,r->mid + 1,b);
   }
 return 0;
}

long UpdateVal(PNod r,long a,long b)
{
 if (r->left == r->right)
   {
    return r->val += b;
   }
 if (a <= r->mid)
   {
    UpdateVal(r->L,a,b);
    r->val += b;
   }
 if (a > r->mid)
   {
    UpdateVal(r->R,a,b);
    r->val += b;
   }
 return 0;
}

long AflaLen(PNod r,long a)
{
 if (r->val == a)
   {
    return r->right;
   }
 if (r->left == r->right)
   {
    return -1;
   }
 if (r->L->val >= a)
   {
    return AflaLen(r->L,a);
   }
  else
   {
    return AflaLen(r->R,a - r->L->val);
   }
 return 0;
}

int main(void)
{
 fstream fin("aib.in",ios::in);
 fstream fout("aib.out",ios::out);
 long i,op,a,b;
 fin >> N >> M;
 for (i = 1;i <= N;i += 1)
  {
   fin >> A[i];
  }
 T = ConstruiesteArbore(1,N);
 ComputeSum(T);
 for (i = 0;i < M;i += 1)
  {
   fin >> op;
   switch (op)
    {
     case 0 :
       {
        fin >> a >> b;
        UpdateVal(T,a,b);
       }
      break;
     case 1 :
       {
        fin >> a >> b;
        fout << AflaSum(T,a,b) << "\n";
       }
      break;
     case 2 :
       {
        fin >> a;
        fout << AflaLen(T,a) << "\n";
       }
      break;
    };
  }
 fin.close();
 fout.close();
 return 0;
}