Cod sursa(job #2331406)

Utilizator ciutanpCiuta Andrei Calin ciutanp Data 29 ianuarie 2019 16:17:01
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include<bits/stdc++.h>
#define NMAX 100001
using namespace std;

ifstream f("aib.in");
ofstream g("aib.out");

int Aib[NMAX];
int n,m,x,y,val,poz,start,finish;
int op;

void add(){
    while(poz<=n)
    {
        Aib[poz]=Aib[poz]+val;
        poz+=(poz&(-poz));
    }
}
int sum(int pozi)
{
    int s=0;
    while(pozi>0)
    {
        s+=Aib[pozi];
        pozi-=(pozi&(-pozi));
    }
    return s;
}

int main()
{
    f>>n>>m;
    for(int i=1;i<=n;++i)
    {
        f>>val;
        poz=i;
        add();
    }
    while(m--)
    {
        f>>op;
        if(op==0)
        {
            f>>poz>>val;
            add();
        } else if(op==1){
            f>>start>>finish;
            g<<sum(finish)-sum(start-1)<<'\n';
        } else if(op==2)
        {
            int cauta;
            f>>cauta;
            int dr,st;
            int mij;
            int sol=-1;
            st=1;
            dr=n;
            while(st<=dr)
            {
                int mij=(st+dr)/2;
                int suma=sum(mij);
                if(suma>cauta)
                {
                    dr=mij-1;
                } else if(suma<cauta)
                {
                    st=mij+1;
                } else {
                    sol=mij;
                    dr=mij-1;
                }
            }
            g<<sol<<'\n';
        }
    }

    return 0;
}