Cod sursa(job #215269)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 18 octombrie 2008 09:37:06
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
# include <cstdio>

using namespace std;

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

int N,M,i,j,o,a,b,Pow;
int A[MAXN];

    void add(int p, int val)
    {
        for (; p <= N; A[p] += val,p += p^(p-1)&p);
    }
    
    int sum(int p)
    {
        int s = 0;
         
        for (; p; s += A[p],p -= p^(p-1)&p);
        
        return s;
    }
    
    int search(int val, int Pow)
    {
        int i = 0,k;
        
        for (k = Pow; Pow && val; Pow >>= 1,k = i + Pow)
          if (k <= N && val >= A[k])
            {
               val -= A[k]; 
               i += Pow;
            }
        if (!val) return i;
        return -1;
    }

    int main()
    {
        freopen(FIN,"r",stdin);
        freopen(FOUT,"w",stdout);
        
        scanf("%d%d",&N,&M);
        for (i = 1; i <= N; ++i)
          {
              scanf("%d",&a);
              add(i,a);
          }
          
        for (Pow = 1; Pow << 1 <= N; Pow <<= 1);
         
        for (i = 1; i <= M; ++i)
          {
              scanf("%d",&o);
              if (o == 2)
                {
                   scanf("%d",&a);
                   if (!a) printf("-1\n");
                   else
                   printf("%d\n",search(a,Pow));
                }
              else
                {
                   scanf("%d%d",&a,&b);
                   if (o == 0)
                     add(a,b);
                   else
                     printf("%d\n",sum(b)-sum(a-1));
                }
          }
        
        return 0;
    }