Cod sursa(job #204895)

Utilizator mika17Mihai Alex Ionescu mika17 Data 27 august 2008 23:46:52
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <cstdio>
#define NMAX 100001

int N,M,log2[NMAX],aib[NMAX];

void log()
{
 for(int i = 2 ; i <= N ; ++i)
  log2[i] = log2[i>>1] + 1;
}

void update(int poz,int x)
{
 while(poz <= N)
 {
  aib[poz] += x;
  poz += poz & -poz;
 }
}

int query(int p)
{
 int s = 0;
 while(p>0)
 {
  s += aib[p];
  p -= p & -p;
 }
 return s;
}

int search(int s)
{
 int mask = log2[N] , p = 0, sum = 0;
 while(mask>=0)
 {
  if(p + (1<<mask) <= N & sum + aib[p + (1<<mask)] <= s)
  {
    p += 1<<mask;
    sum += aib[p];
    --mask;
    if(sum == s) return p;
  }
   else --mask;
 }
 return -1;
}

void readSolve()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d %d",&N,&M);
    log();
    for(int i = 1 , x ; i <= N ; ++ i )
    {
      scanf("%d",&x);
      update(i,x);
    }
    while(M--)
    {
     int op , p , x , l , r , k;
     scanf("%d",&op);
     switch(op)
     {
        case 0: scanf("%d %d",&p,&x); update(p,x); break;
        case 1: scanf("%d %d",&l,&r); printf("%d\n",query(r) - query(l-1)); break;
        case 2: scanf("%d",&k); printf("%d\n",search(k)); break;
     }
    }
}

int main()
{
 readSolve();
 return 0;
}