Cod sursa(job #1044304)

Utilizator usermeBogdan Cretu userme Data 29 noiembrie 2013 16:34:40
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <cstdio>

FILE*f=fopen("aib.in","r");
FILE*h=fopen("aib.out","w");

int t[100001];

int n,m;

int query(int i){
    int s=0;
    while ( i!=0 ){
        s+=t[i];
        i-= ( i&-i );
    }
    return s;
}

void update(int i, int val){
    while ( i<=n ){
        t[i]+=val;
        i+= ( i&-i );
    }
}

int main()
{
    fscanf(f,"%d%d",&n,&m);
    for ( int i=1;i<=n;++i ){
        int x;
        fscanf(f,"%d",&x);
        update(i,x);
    }
    for ( int i=1;i<=m;++i ){
        int fl,x,y;
        fscanf(f,"%d",&fl);
        if ( fl==0 ){
            fscanf(f,"%d%d",&x,&y);
            update(x,y);
        }
        if ( fl==1 ){
            fscanf(f,"%d%d",&x,&y);
            fprintf(h,"%d\n",query(y)-query(x-1));
        }
        if ( fl==2 ){
            int p=0;
            fscanf(f,"%d",&x);
            for ( int pas=1<<17;pas;pas/=2 )
                if ( p+pas<=n&&query(p+pas)<x )p+=pas;
            if ( query(p+1)==x )
                fprintf(h,"%d\n",p+1);
            else
                fprintf(h,"-1\n");
        }
    }
    return 0;
}