Cod sursa(job #3039683)

Utilizator christalknightChristian Micea christalknight Data 28 martie 2023 19:32:30
Problema Arbori indexati binar Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.82 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("aib.in");
ofstream fout("aib.out");

const int nmax = 100003;
int n, m, v[nmax];
unsigned int sumPart[nmax]; 

void read(void);
void solveSumPart(void);
int binSearch(int left, int right, int valCautat);

int main(){
    read();
    solveSumPart();
    fin.close();
    //fout.close();
    }

void read(void){
    int i;
    fin>>n>>m;
    for(i = 1; i <= n; i++){
        fin>>v[i];
        sumPart[i] = sumPart[i - 1] + v[i];
        }
    }

void solveSumPart(void){
    int x, y, z, i;
    //cout<<"here\n";
    while(m--){
        //cout<<"m = "<<m<<"\n";
        fin>>x;
        switch(x){
            case 0:
                //cout<<"case0\n";
                fin>>y>>z;
                v[y] += z;
                for(i = y; i <= n; i++)
                    sumPart[i] += z;
                break;
            case 1:
                //cout<<"case1\n";
                fin>>y>>z;
                fout<<sumPart[z] - sumPart[y - 1]<<"\n";
                break;
            case 2:
                //cout<<"case2\n";
                fin>>y;
                z = binSearch(1, n, y);
                //cout<<z<<"\n";
                fout<<z<<"\n";
                break;
            default:
                break;
            }
        //cout<<"m = "<<m<<"\n";
        }
    //cout<<"end\n";
    }

int binSearch(int left, int right, int valCautat){
    //fout<<"left = "<<left<<", right = "<<right<<"\n";
    if(left == right && valCautat == sumPart[left])
        return left;
    else if(left == right)
        return -1;
    int mid = (left + right) / 2;
    int val = binSearch(left, mid, valCautat);
    if(val != -1)
        return val;
    else return binSearch(mid + 1, right, valCautat);
    }