Cod sursa(job #2503095)

Utilizator armigheGheorghe Liviu Armand armighe Data 2 decembrie 2019 12:49:04
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include<cstdio>
#include<fstream>
using namespace std;
FILE *f=fopen("aib.in","r");
ofstream g("aib.out");
int n,aib[100002],pw;

int querysum(int poz)
{
    int sol=0,i;
    for(i=poz;i>=1;i-=i&-i)
        sol+=aib[i];
    return sol;
}

void update(int poz,int add)
{
    int i;
    for(i=poz;i<=n;i+=i&-i)
        aib[i]+=add;
}

void rez(int s)
{
    int p=pw,ok=0,i=0;
    while(p>=1)
    {
        if(aib[i+p]==s)
            ok=1;
        if(aib[i+p]<s)
        {
            s-=aib[i+p];
            i+=p;
            p/=2;
        }
        else
            p/=2;
        while(i+p>n&&p>=1)
            p/=2;
    }
    if(ok==1)
        g<<i+1<<'\n';
    else
        g<<-1<<'\n';
}

int main()
{
    int m,x,y,p,i;
    fscanf(f,"%d%d",&n,&m);
    for(i=1;i<=n;i++)
    {
        fscanf(f,"%d",&x);
        update(i,x);
    }
    pw=1;
    while(pw<=n)
        pw*=2;
    pw/=2;
    for(i=1;i<=m;i++)
    {
        fscanf(f,"%d",&p);
        if(p==0)
        {
            fscanf(f,"%d%d",&x,&y);
            update(x,y);
        }
        else
        if(p==1)
        {
            fscanf(f,"%d%d",&x,&y);
            g<<querysum(y)-querysum(x-1)<<'\n';
        }
        else
        {
            fscanf(f,"%d",&x);
            rez(x);
        }
    }
    return 0;
}