Cod sursa(job #174471)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 8 aprilie 2008 21:24:11
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include<stdio.h>      
long x[100001],n,m,i,val,ad,poz,cod,st,dr,s,salt,saltmax,ok;   
int main()      
{      
    freopen("aib.in","rt",stdin);      
    freopen("aib.out","wt",stdout);      
    scanf("%ld%ld",&n,&m);      
    saltmax=1;      
    while(saltmax<n)saltmax<<=1;      
    for(i=1;i<=n;i++)      
    { scanf("%ld",&val);      
      poz=i;      
      for(ad=1;poz<=n;ad<<=1)      
       if(ad&poz){x[poz]+=val;poz+=ad;}      
    }      
    for(;m;m--)      
    { scanf("%ld",&cod);      
      if(!cod)      
      { scanf("%ld%ld",&poz,&val);      
        for(ad=1;poz<=n;ad<<=1)      
         if(ad&poz){x[poz]+=val;poz+=ad;}      
        continue;      
      }      
      if(cod==1)      
      { scanf("%ld%ld",&st,&dr);      
        s=0;      
        poz=dr;      
        for(ad=1;poz;ad<<=1)      
         if(ad&poz){s+=x[poz];poz-=ad;}      
        poz=st-1;      
        for(ad=1;poz;ad<<=1)      
         if(ad&poz){s-=x[poz];poz-=ad;}      
        printf("%ld\n",s);      
        continue;      
      }      
      scanf("%ld",&s);      
      if(!s){printf("-1\n");continue;}   
      poz=0;ok=0;   
      for(salt=saltmax;salt;salt>>=1)      
      { if(poz+salt<=n)      
         if(s>=x[poz+salt])      
          {poz+=salt;s-=x[poz];}      
        if(!s)      
        {printf("%ld\n",poz);ok=1;break;}      
      }      
      if(!ok)printf("-1\n");      
    }      
    fcloseall();      
    return 0;      
}