Cod sursa(job #1436235)

Utilizator nnnmmmcioltan alex nnnmmm Data 15 mai 2015 15:48:04
Problema Arbori indexati binar Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include<cstdio>
int aib[100001];
int n;
int put2(int numar)
{
 return numar xor (numar&(numar-1));
}
void adauga(int poz,int elem)
{
 if(put2(poz)==0)
    aib[poz]+=elem,poz++;
 while(poz<=n)
       {
        aib[poz]+=elem;
        poz+=(put2(poz));
       }
}
// Suma(1,poz)
int suma(int poz)
{
 int S=0;
 while(poz>0)
       {
        S+=aib[poz];
        poz-=(put2(poz));
       }
 return S;
}
int main()
{
 freopen("aib.in","r",stdin);
 freopen("aib.out","w",stdout);
 int m;
 scanf("%d %d",&n,&m);
 for(int i=1;i<=n;i++)
     {
      int elem;
      scanf("%d ",&elem);
      adauga(i,elem);
     }
 for(int j=1;j<=m;j++)
     {
      int tip;
      scanf("%d ",&tip);
      switch(tip)
             {
              case 0:{
                      int poz,val;
                      scanf("%d %d ",&poz,&val);
                      adauga(poz,val);
                      break;
                     };
              case 1:{
                      int st,dr;
                      scanf("%d %d ",&st,&dr);
                      printf("%d\n",suma(dr)-suma(st-1));
                      break;
                     };
              case 2:{
                      int s;
                      scanf("%d ",&s);
                      bool pp=true;
                      for(int i=1;i<=n && pp;i++)
                          {
                           if(suma(i)==s)
                              {
                               printf("%d\n",i);
                               pp=0;
                              }
                          }
                      if(pp)
                         printf("-1\n");
                      break;
                     };
             }
     }
fclose(stdin);
fclose(stdout);
return 0;
}