Cod sursa(job #386298)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 24 ianuarie 2010 16:28:10
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<iostream>
#include<string>

using namespace std;

#define NM 100005
#define FOR(i,a,b)for(int i=(a);i<=(b);++i)
#define lsb(x)(((x)^(x-1))&(x))

int N,M;

int AIB[NM];

inline void update(int poz,int val)
{
     while(poz<=N)
     {
       AIB[poz]+=val;
       poz+=lsb(poz);
     }  
}

inline int query(int poz)
{
     int ans=0;
     
     while(poz)
     {
       ans+=AIB[poz];
       poz-=lsb(poz);
     }  
     
     return ans;
}

int main()
{
    int val,a,b,op;
    
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    
    scanf("%d %d",&N,&M);
    
    FOR(i,1,N)
    {
      scanf("%d",&val);
      update(i,val);
    }  
    
    FOR(i,1,M)
    {
      scanf("%d",&op);
      
      if(op==0)
      {
        scanf("%d %d",&a,&b);
        update(a,b);
      }
      
      if(op==1)
      {
        scanf("%d %d",&a,&b);
        int ans=query(b)-query(a-1);
        printf("%d\n",ans);
      }
      
      if(op==2)
      {
        scanf("%d",&a);
        
        int st=1;int dr=N;
        
        while(st<dr)
        {
          int mij=(st+dr)/2;
          
          if(query(mij)>=a) dr=mij;
          else st=mij+1;
        }
        
        if(query(st)==a) printf("%d\n",st);
        else printf("-1\n");
      }
    }
    
    return 0;
}