Cod sursa(job #1498728)

Utilizator stelian2000Stelian Chichirim stelian2000 Data 9 octombrie 2015 00:05:18
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <cstdio>

using namespace std;

int aib[100010];
int n;

void update(int i,int s)
{
    for(;i<=n;i+=i&(-i)) aib[i]+=s;
}

int query(int i)
{
    int s=0;
    for(;i>0;i-=i&(-i)) s+=aib[i];
    return s;
}

int gaseste_poz(int s)
{
    int poz=0;
    for(int i=20;i>=0;i--)
        if(poz+(1<<i)<=n && aib[poz+(1<<i)]<s)
        {
            s-=aib[poz+(1<<i)];
            poz+=1<<i;
        }
    return poz+1;
}

int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    int m,x,a,b,poz;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        update(i,x);
    }
    for(int i=1;i<=m;i++)
    {
        scanf("%d",&x);
        if(x==0) {scanf("%d%d",&a,&b);update(a,b);}
        if(x==1) {scanf("%d%d",&a,&b);printf("%d\n",query(b)-query(a-1));}
        if(x==2) {scanf("%d",&a);poz=gaseste_poz(a);printf("%d\n",poz);}
    }
    return 0;
}