Cod sursa(job #1920495)

Utilizator duesakBourceanu Cristian duesak Data 10 martie 2017 01:38:40
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include<fstream>
#include<cmath>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int inf=1<<30;
int v[200002];
int binsearch(int lf, int rh,int vl){
    int mij,indx,aux,s;
    mij=(lf+rh)/2;
    while(lf<rh){
        s=0;
        indx=mij;
        while(indx){
            s+=v[indx];
            indx=indx&(indx-1);
        }
        //if(vl==s)break;
        if(vl<=s)rh=mij;
        else lf=mij+1;
        mij=(lf+rh)/2;
    }
    s=0;
    indx=mij;
        while(indx){
            s+=v[indx];
            indx=indx&(indx-1);
        }
    if(s==vl)return mij;
    return -1;
}
int main(){
    int n,m,i,x,p,a,b,s,aux;
    int indx;
    fin>>n>>m;
    for(i=1;i<=n;i++){
        fin>>x;
        indx=i;
        while(indx<=n){
            v[indx]+=x;
            aux=indx;
            indx=indx&(-indx);
            indx=aux+indx;
        }
    }
    for(i=1;i<=m;i++){
        fin>>p>>a;
        if(p==0){
            fin>>b;
            indx=a;
            while(indx<=n){
                v[indx]+=b;
                aux=indx;
                indx=indx&(-indx);
                indx=aux+indx;
            }
        }
        if(p==1){
            fin>>b;
            s=0;
            indx=b;
            while(indx){
                s+=v[indx];
                indx=indx&(indx-1);
            }
            indx=a-1;
            while(indx){
                s-=v[indx];
                indx=indx&(indx-1);
            }
            fout<<s<<'\n';
        }
        if(p==2)fout<<binsearch(1,n,a)<<'\n';

    }
    fin.close();
    fout.close();
    return 0;
}