Cod sursa(job #2040796)

Utilizator RaduXD1Nicolae Radu RaduXD1 Data 16 octombrie 2017 16:00:52
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n,m,i,a,b,ok,z[100002],t;

void update(int p, int val)
{
    for(;p<=n;p+=p&(-p))
        z[p]+=val;
}

int quarry(int p)
{
    int r=0;
    for(;p>=1;p-=p&(-p))
        r+=z[p];
    return r;
}

void cauta(int rez)
{
    int st=1, dr=n ,mid=0, aux;
    while(st<=dr)
    {
        mid=(st+dr)/2;
        aux=quarry(mid);
        if(aux==rez)
        {
            fout<<mid<<"\n";
            ok=1;
            return;
        }
        else
            if(aux>rez)
                dr=mid-1;
            else
                st=mid+1;
    }
}

int main()
{
    fin>>n>>m;
    for(i=1;i<=n;i++)
    {
        fin>>a;
        update(i, a);
    }
    for(i=1;i<=m;i++)
    {
        fin>>t;
        fin>>a;
        if(t==0)
        {
            fin>>b;
            update(a, b);
        }
        if(t==1)
        {
            fin>>b;
            fout<<quarry(b)-quarry(a-1)<<"\n";
        }
        if(t==2)
        {
            ok=0;
            cauta(a);
            if(ok==0)
                fout<<"-1\n";
        }
    }
    fin.close();
    fout.close();
    return 0;
}