Cod sursa(job #1889241)

Utilizator cyber_ghSoltan Gheorghe cyber_gh Data 22 februarie 2017 17:18:40
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <bits/stdc++.h>
 
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int N,M,aib[100010];
 
int parent(int x){
    return x-(x&(~x)+1);
}
int next(int x){
    return x+(x&(~x)+1);
}
 
bool inrange(int x){
    return  x<=N;
}
 
void update(int index,int val){
    if (inrange(index)){
        aib[index]+=val;
        update(next(index),val);
    }
    else return;
     
}
 
int getsum(int x){
    if (x){
        return aib[x]+getsum(parent(x));
    }
    else return 0;
}
int binarysearch(int st,int dr,int val){
    int mid;
    while (st<=dr){
        mid=(st+dr)/2;
        if (getsum(mid)>val)dr=mid-1;
        else st=mid+1;
    }
    if (!dr) return -1;
    if (getsum(dr)==val) return dr;
    else return -1;
}
 
void caz1(){
     
    int x,y;
    fin >>x>>y;
    update(x,y);
     
}
void caz2(){
    int x,y;
    fin >>x>>y;
    fout <<getsum(y)-getsum(x-1)<<"\n";
     
}
void caz3(){
    int x;
    fin >>x;
    int index=binarysearch(1,N,x);
    fout <<index<<"\n";
}
 
int main(){
 
    fin >>N>>M;
    for (int i=0;i<N;i++){
        int x;
        fin >>x;
        update(i+1,x);
    }
    while (M--){
        short x;
        fin>>x;
        switch(x){
            case 0:caz1();break;
            case 1:caz2();break;
            case 2:caz3();break;
             
        }   
         
    }
    return 0;
}