Cod sursa(job #2562479)

Utilizator horea4Cenan Horea horea4 Data 29 februarie 2020 14:52:48
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <iostream>

#include <fstream>

#define MAXN 100005

using namespace std;



int aib[MAXN];

int n,m;



ifstream fin("aib.in");

ofstream fout("aib.out");



int nrZerouri(int x)

{

    return (x&(-x));

}



void adaugare(int valoare, int poz)

{

    int pozitie=poz;

    while(pozitie<=n)

    {

        aib[pozitie]+=valoare;

        pozitie+=nrZerouri(pozitie);

    }

}



long long int suma(int x)

{

    long long int s=0;

    for(int i=x;i>0;i-=nrZerouri(i))

        s+=aib[i];

    return s;

}

long long int s(int x, int y)

{

    return suma(y)-suma(x-1);

}

int cautbin(int val)

{

    int st=1, dr=n;

    while(st<=dr)

    {

        int mij=(st+dr)/2, sum=s(1,mij);

        if(sum==val)

            return mij;

        if(sum<val)

            st=mij+1;

        else

            dr=mij-1;

    }

    return -1;

}

void citire()

{

    fin>>n>>m;



    for(int i=1;i<=n;i++)

    {

        int x;

        fin>>x;

        adaugare(x,i);

    }

    int op;

    for(int i=0;i<m;i++)

    {

        fin>>op;

        if(op==0)

        {

            int x,y;

            fin>>x>>y;

            adaugare(y,x);

        }

        if(op==1)

        {

            int x,y;

            fin>>x>>y;

            fout<<s(x,y)<<"\n";

        }

        if(op==2)

        {

            int x;

            fin>>x;

            int poz=cautbin(x);

            fout<<poz<<"\n";

        }

    }

}

int main()

{

    citire();

    return 0;

}