Cod sursa(job #1149493)

Utilizator Claudiu95Vartolomei Alexandru Claudiu Claudiu95 Data 21 martie 2014 22:09:22
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>
#define maxn 300005
using namespace std;

ifstream f("aib.in");
ofstream g("aib.out");

long long int putere(int x){
    return x&(-x);
}
int x,arb[maxn],x1,x2,op,n,m,s1,s2,poz;
long long int a;
void update(long long int poz,long long int val){
    while(poz<=n){
        arb[poz]+=val;
        poz+=putere(poz);
    }

}
 int suma(  int pozitie){
     int s=0;
    while(pozitie>0){
        s+=arb[pozitie];
        pozitie-=putere(pozitie);
    }
    return s;

}
 int find (long long int a){
   int lim=1,poz=0;
   while(lim<n)
    lim<<=1;
   while(a && lim){
    if(lim+poz<=n){
        if(a>=arb[lim+poz]){
            a-=arb[lim+poz];
            poz+=lim;
            if(a==0)
                return poz;
        }
    }
    lim>>=1;
   }
   return -1;
}
int main()
{
     f>>n>>m;

    for(int i=1;i<=n;++i){
        f>>x;

        poz=i;
        update(poz,x);

    }
    for(int i=1;i<=m;++i){
        f>>op;
        if(op==0){
                f>>x1>>x2;
            update(x1,x2);
        }
        else
        if(op==1){
                f>>x1>>x2;
                s1=suma(x2);
                s2=suma(x1-1);
                g<<s1-s2<<"\n";
        }
        else{

            f>>a;
            g<<find(a);
            g<<"\n";
        }
    }

    return 0;
}