Cod sursa(job #779601)

Utilizator stefanzzzStefan Popa stefanzzz Data 18 august 2012 10:45:14
Problema Arbori indexati binar Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <fstream>
#define MAXN 100005
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");

long n,m,x,y,v[MAXN],nr0,tip,S1,S,st,dr,mij;

void adauga(long a,long b);
void suma(long a);

int main()
{
    int i,j;
    f>>n>>m;
    for(i=1;i<=n;i++){
        f>>x;
        for(j=i;j<=n;j+=(1<<nr0)){
            for(nr0=1;!(j%(1<<nr0));nr0++);
            nr0--;
            v[j]+=x;}}
    for(i=1;i<=m;i++){
        f>>tip;
        if(!tip){
            f>>x>>y;
            adauga(y,x);
            continue;}
        if(tip==1){
            f>>x>>y;
            suma(y);
            S1=S;
            suma(x-1);
            g<<S1-S<<'\n';}
        else{
            f>>x;
            if(!x){
                g<<"0\n";
                continue;}
            st=1;
            dr=n;
            while(st<dr){
                mij=(st+dr)/2;
                suma(mij);
                if(S==x)
                    break;
                if(S<x)
                    st=mij+1;
                else
                    dr=mij-1;}
            if(S==x)
                g<<mij<<'\n';
            else{
                suma(st);
                if(S==x)
                    g<<st<<'\n';
                else
                    g<<"-1\n";}}}
    f.close();
    g.close();
    return 0;
}

void adauga(long a,long b){
    for(b;b<=n;b+=(1<<nr0)){
        for(nr0=1;!(b%(1<<nr0));nr0++);
        nr0--;
        v[b]+=a;}}

void suma(long a){
    S=0;
    for(a;a>0;a-=(1<<nr0)){
        for(nr0=1;!(a%(1<<nr0));nr0++);
        nr0--;
        S+=v[a];}}