Cod sursa(job #790683)

Utilizator idomiralinIdomir Alin idomiralin Data 22 septembrie 2012 09:37:23
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
# include <cstdio>

using namespace std;


int val, n, m, i, op, a, b, aib[100005];
void update(int pos, int v)
{int k;
     
     k = 0;
     while (pos <= n)
     {
           while ( !(pos & 1<<k)) k++;
           aib[pos] += v;
           pos += 1<<k;
           k++;
           }
     }
     
int query(int pos)
{int sum, k;
    
     sum = 0; k = 0;
     while (pos > 0)
     {
           while ( !(pos & 1<<k)) k++;
           sum += aib[pos];
           pos -= 1<<k;
           k++;
           }
     
     return sum;
     } 
                 
int cautbin(int s)
{int st, dr, mij;
    
    st = 1; dr = n;
    while (st <= dr)
    {
          mij = (st + dr) / 2;
          if (s > aib[mij]) st = mij + 1;
          else if (s < aib[mij]) dr = mij - 1;
          else if (s == aib[mij]) return mij;           
          }
    
    return -1;
}


int main()
{int  poz;
    
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    
    scanf("%d %d",&n,&m);
    for (i = 1; i <= n; i++)
    {
        scanf("%d",&val);
        update(i,val);
        }
        
    for (i = 1; i <= m; i++)
    {
        scanf("%d",&op);
        if (op == 2) {
               scanf("%d",&poz);
               printf("%d\n",cautbin(poz));
               }
        else {
             scanf("%d%d",&a,&b);
         
        if (!op) update(a,b);
        else if (op == 1) printf("%d\n",query(b) - query(a - 1));
             }
        }
        
return 0;
}