Cod sursa(job #3129023)

Utilizator RMTomaRican Mihai Toma RMToma Data 12 mai 2023 11:00:11
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
const int NMax = 1e5+5;
int Aib[NMax], v[NMax], n;
ifstream in("aib.in");
ofstream out("aib.out");
int sum(int a, int index){
    int sum = 0;
    
    index = index+1;
    a = a+1;
    while(index>a){
        sum += Aib[index];
        index -= (index & -index);
    }
    return sum;
}

int sum1(int index){
    int sum = 0;
    
    index = index+1;
    while(index>0){
        sum += Aib[index];
        index -= (index & -index);
    }
    return sum;
}
void upd(int index, int n, int val){
    
    index = index+1;
    
    while(index<=n){
        
        Aib[index]+=val;
        
        index += (index & -index);
   
    }
}
void construct(int arr[], int n){
    for(int i=1;i<=n;i++){
        Aib[i] = 0;
    }
    
    for(int i=0;i<n;i++){
        upd(i, n, arr[i]);
    }
    
    
}
int search(int b, int y){
    int st = 1, dr = n;
    if(y==v[0]){
        return 1;
    }
    while(st<dr){
        int mid = (st+dr)/2;
        int h = sum1(mid);
        if(h<y){
            st = mid+1;
            dr = dr;
        } else if(h>y){
            st = st;
            dr = mid;
        } else if(h==y){
            return mid+1;
        }
    }
    return -1;
}
int main()
{
    int x,y,z,k;
    in >> n >> k;
    for(int i=0;i<n;i++){
        in >> v[i];
    }
    construct(v, n);
    out << 1/2 << " ";
   for(int i=1;i<=k;i++){
       in >> x;
       
       if(x==0){
           in >> y >> z;
           upd(y, n, z);
       } else if (x==1) {
           in >> y >> z;
           out << sum(y, z) << "\n";
       } else if(x==2){
           in >> y;
          out << search(n, y) << "\n";
       }
   }
}