Cod sursa(job #1364444)

Utilizator blue_skyPetrica Stefan Cosmin blue_sky Data 27 februarie 2015 17:55:53
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#define DIM 100002

using namespace std;
int n,m,x,a,b;
long arb[7*DIM];
short t;

void Update(int k,int poz,int x,int st,int dr){
    arb[k]+=x;
    int mid=(st+dr)/2;

    if(st==dr) return;

    if(poz<=mid) Update(k*2,poz,x,st,mid);
    else Update(k*2+1,poz,x,mid+1,dr);
}
int Queri(int k,int a,int b,int st,int dr){
    if(a<=st && b>=dr) return arb[k];

    else{
        int mid=(st+dr)/2;
        if(b<=mid) return Queri(k*2,a,b,st,mid);
        else if(a>mid) return Queri(k*2+1,a,b,mid+1,dr);
        else return Queri(k*2,a,mid,st,mid)+Queri(k*2+1,mid+1,b,mid+1,dr);
    }
}
int search(int k, int a,int st,int dr){
    if(arb[k]==a) return dr;
    else if(st>=dr) return -1;

    int mid=(st+dr)/2;
    if(arb[k*2]>=a) return search(k*2,a,st,mid);
    else return search(k*2+1,a-arb[k*2],mid+1,st);
}

int main()
{
    ifstream f("aib.in");
    ofstream g("aib.out");
    f>>n>>m;
    for(int i=1;i<=n;++i){
        f>>x;
        Update(1,i,x,1,n);
    }
    for(int i=1;i<=m;++i){
        f>>t;
        if(t<2){
            f>>a>>b;
            if(t==0) Update(1,a,b,1,n);
            else g<<Queri(1,a,b,1,n)<<'\n';
        }
        else {
            f>>a;
            g<<search(1,a,1,n)<<'\n';
        }
    }
    f.close();
    g.close();
    return 0;
}