Cod sursa(job #2541387)

Utilizator hunting_dogIrimia Alex hunting_dog Data 8 februarie 2020 13:08:10
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <time.h>
#define NMAX 100001

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

int v[NMAX],aib[NMAX],n;

void print(int *v,int n)
{
    for(int i=1;i<=n;++i)
        cout<<v[i]<<' ';
    cout<<'\n';
}

void update(int index,int x)
{
    for(int i=index;i<=n;i+=i&(~i+1))
        {
            aib[i]+=x;
        }
}

int getSum(int left,int right)
{
    int s1=0,s2=0;
    for(int i=left-1;i>0;i-=i&(~i+1))
        s1+=aib[i];
    for(int i=right;i>0;i-=i&(~i+1))
        s2+=aib[i];
    return s2-s1;
}

int findK(int k)
{
    int i=1,j=n;
    while(i<=j)
    {
        int m=(i+j)/2;
        int s=getSum(1,m);
        if(s==k)
            return m;
        if(s<k)
            i=m+1;
        else
            j=m-1;
    }

    return -1;
}

int main()
{
    int q;
    fin>>n>>q;
    for(int i=1;i<=n;++i)
        fin>>v[i];
    for(int i=1;i<=n;++i)
        update(i,v[i]);
    while(q--)
    {
        int op,x,y;
        fin>>op;
        if(op==0)
        {
            fin>>x>>y;
            update(x,y);
        }
        else if(op==1)
        {
            fin>>x>>y;
            fout<<getSum(x,y)<<'\n';
        }
        else
        {
            fin>>x;
            fout<<findK(x)<<'\n';
        }
    }


    return 0;
}