Cod sursa(job #640085)

Utilizator valentin.harsanValentin Harsan valentin.harsan Data 24 noiembrie 2011 18:59:10
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include<fstream>
using namespace std;

const int N = 100010;

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

int n,m,x[N],aib[N];

void change(int poz, int val) {
    int nr,tm;

    while(poz<=n) {

        aib[poz]+=val;

        nr=1; tm=poz;
        while(!(tm&1)) {
            nr<<=1;

            tm>>=1;
        }

        poz+=nr;

    }

}

int sum(int poz) {
    int rez=0,nr,tm;

    while(poz>0) {

        rez+=aib[poz];

        nr=1; tm=poz;
        while(!(tm&1)) {
            nr<<=1;

            tm>>=1;
        }

        poz-=nr;

    }

    return rez;
}

int main() {
    int i,op,poz,val,a1,a2,j,a,pas;

    in >> n >> m;

    for(i=1;i<=n;++i) {
        in >> val;

        change(i,val);

        x[i]=val;
    }

    for(i=1;i<=m;++i) {

        in >> op;

        if(op==0) {
            in >> poz >> val;

            change(poz,val);

            x[poz]=val;
        }
        if(op==1) {
            in >> a1 >> a2;

            out << sum(a2) - sum(a1-1) << "\n";
        }
        if(op==2) {
            in >> a;

            pas=1<<16;

            for(j=0;pas!=0;pas>>=1)
                if(j+pas<=n && sum(j+pas)<=a)
                    j+=pas;

            if(sum(j)==a)
                out << j << "\n";
            else
                out << "-1\n";
        }
    }

    return 0;
}