Cod sursa(job #183032)

Utilizator floringh06Florin Ghesu floringh06 Data 21 aprilie 2008 17:23:59
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.03 kb
#include <cstdio>
#include <cstring>

using namespace std;

#define FIN "aib.in"
#define FOUT "aib.out"
#define MAX_N 100005

int A[MAX_N];
int C[MAX_N];

int N, M;

    void buildtree ()
    {
         int i, p;
         
         for (i = 1; i <= N; ++i)
         {
             p = i^(i&(i - 1));
             C[i] = A[i] - A[i - p];
         }
    }
     
    void update (int c, int pz)
    {
         int p;
         
         while (pz <= N)
         {
               C[pz] += c, pz += p = pz^(pz&(pz - 1));
         }
    }
    
    int query (int a, int b)
    {
         int ind, p;
         int s1 = 0, s2 = 0;
         for (ind = a - 1; ind > 0;) s1 += C[ind], ind -= p = ind^(ind&(ind - 1));
         for (ind = b; ind > 0;) s2 += C[ind], ind -= p = ind^(ind&(ind - 1));    
         
         return s2 - s1;
    }
             
    int bsearch (int c)
    {
        int li, lf, m, ret = -1;
        li = 1, lf = N;
        
        while (li <= lf)
        {
              m = (li + lf) >> 1;
              
              int q = query (1, m);
              if (q == c) ret = m, lf = m - 1;
              
              if (q > c) lf = m - 1;
              if (q < c) li = m + 1;
        }
        
        return ret;
    }          

    int main ()
    {
        freopen (FIN, "r", stdin);
        freopen (FOUT, "w", stdout);
        
        scanf ("%d %d", &N, &M);
        int i;
        for (i = 1; i <= N; ++i)
        {
            int x;
            scanf ("%d", &x);
            A[i] = A[i - 1] + x;
        }
        
        buildtree ();
        
        for (i = 1; i <= M; ++i)
        {
            int tp, a, b;
            scanf ("%d", &tp);
            if (!tp) 
               scanf ("%d %d", &a, &b), update (b, a);
            if (tp == 1)
               scanf ("%d %d", &a, &b), printf ("%d\n", query(a, b));
            if (tp == 2)
               scanf ("%d", &a), printf ("%d\n", bsearch(a));
        }
        
        return 0;
    }