Cod sursa(job #2097394)

Utilizator lupulescu2001Lupulescu Vlad lupulescu2001 Data 31 decembrie 2017 11:21:23
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<fstream>

using namespace std;

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

int N,M,V[100003];

void Sum(int Poz,int Add)
{
    int K;
    for(int i=Poz; i<=N; i=i+K)
        {
            V[i]+=Add;
            K=(i&(-i));
        }
}

int DetSum(int Poz)
{
    int S=0,K;
    for(int i=Poz; i>=1; i=i-K)
        {
            S=S+V[i];
            K=(i&(-i));
        }
        return S;
}

int CautSum(int S)
{
    int Left=1,Right=N,Mid;
    while(Left<=Right)
    {
        Mid=(Left+Right)/2;
        int K=DetSum(Mid);
        if(K==S)
            return Mid;
        if(K>S)
            Right=Mid-1;
        else
            Left=Mid+1;
    }
    return -1;
}

int main()
{
    fin>>N>>M;
    for(int i=1; i<=N; i++)
    {
        int X;
        fin>>X;
        Sum(i,X);
    }
    for(int i=1; i<=M; i++)
    {
        int X;
        fin>>X;
        if(X==0)
        {
            int Y,Z;
            fin>>Y>>Z;
            Sum(Y,Z);
        }
        else if(X==1)
        {
            int Y,Z;
            fin>>Y>>Z;
            fout<<DetSum(Z)-DetSum(Y-1)<<'\n';
        }
        else
        {
            int Y;
            fin>>Y;
            fout<<CautSum(Y)<<'\n';
        }
    }
}