Cod sursa(job #779603)

Utilizator stefanzzzStefan Popa stefanzzz Data 18 august 2012 11:08:06
Problema Arbori indexati binar Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 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,t,sol;

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;
            sol=-1;
            for(t=1;t<=n;t*=2);
            for(j=0;t;t/=2){
                if(j+t<=n&&x>=v[j+t]){
                    j+=t;
                    x-=v[j];
                    if(!x){
                        sol=j;
                        break;}}}
            g<<sol<<'\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];}}