Cod sursa(job #1583856)

Utilizator nnnmmmcioltan alex nnnmmm Data 29 ianuarie 2016 14:19:35
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include<cstdio>
#define lsb(x) ((x)&(-x))
const int NMAX=100001;
int aib[NMAX];
int N;
void update(int pos,int val)
{
 for(;pos<=N;pos+=lsb(pos))
     aib[pos]+=val;
}
int query(int pos)
{
 int S=0;
 for(;pos;pos-=lsb(pos))
     S+=aib[pos];
 return S;
}
int query(int x,int y)
{
 return query(y)-query(x-1);
}
int main()
{
 freopen("aib.in","r",stdin);
 freopen("aib.out","w",stdout);
 int n,m;
 scanf("%d %d ",&n,&m);
 N=n;
 for(int i=1;i<=n;i++)
     {
      int x;
      scanf("%d ",&x);
      update(i,x);
     }
 for(int i=1;i<=m;i++)
     {
      int tip;
      scanf("%d ",&tip);
      switch(tip)
             {
              case 0:
                 {
                  int a,b;
                  scanf("%d %d ",&a,&b);
                  update(a,b);
                  break;
                 }
              case 1:
                 {
                  int a,b;
                  scanf("%d %d ",&a,&b);
                  printf("%d\n",query(a,b));
                  break;
                 }
              case 2:
                 {
                  int a;
                  scanf("%d ",&a);
                  int st=1,dr=n,rasp=n+1;
                  while(st<=dr)
                        {
                         int mij=(st+dr)/2;
                         if(query(mij)<a)
                            st=mij+1;
                         else
                            {
                             rasp=mij;
                             dr=mij-1;
                            }
                        }
                  if(query(rasp)==a)
                     printf("%d\n",rasp);
                  else
                     printf("-1\n");
                 }
             }
     }
 return 0;
}