Cod sursa(job #1648129)

Utilizator SlevySlevoaca Stefan-Gabriel Slevy Data 11 martie 2016 01:36:10
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

const int NMAX = 100001;
int AI[4*NMAX+69];
ifstream in("aib.in");
ofstream out("aib.out");
int n,m;

void Update(int nod,int st,int dr,int a,int val)
{
    if(st==dr)
    AI[nod]+= val;
    else
    {
        int mij = (st+dr)/2;
        if(a<=mij)
            Update(2*nod,st,mij,a,val);
        if(a>mij)
            Update(2*nod+1,mij+1,dr,a,val);
        AI[nod] = AI[2*nod] + AI[2*nod+1];
    }
}

int Query(int nod,int st,int dr,int a,int b)
{
    if(a<=st && dr<=b)
        return AI[nod];
    else
    {
        int m,m1=0,m2=0;
        m = (st + dr)/2;
        if(a<=m)
            m1 = Query(2*nod,st,m,a,b);
        if(m<b)
            m2 = Query(2*nod+1,m+1,dr,a,b);
        return m1+m2;
    }
    return 0;
}

int binar(int a)
{
    int x = 1,y=n;
    int sum = 0,sum1=0;
    int m;
    while(x<=y)
    {
        m = (x+y)/2;
        sum = Query(1,1,n,1,m);
        if(m>1)
            sum1 = Query(1,1,n,1,m-1);
        else
            sum1 = 0;
        if(sum==a && sum1<a)
            return m;
        else
        {
            if(sum >= a)
                y = m-1;
            else
                x = m+1;
        }
    }
    return -1;
}

int main()
{
    in>>n>>m;
    int x;
    for(int i=1;i<=n;i++)
    {
        in>>x;
        Update(1,1,n,i,x);
    }
    int q,a,b;
    for(int i=1;i<=m;i++)
    {
        in>>q;
        if(q==0)
        {
            in>>a>>b;
            Update(1,1,n,a,b);
            continue;
        }
        if(q==1)
        {
            in>>a>>b;
            out<<Query(1,1,n,a,b)<<"\n";
            continue;
        }
        if(q==2)
        {
            in>>a;
            out<<binar(a)<<"\n";
            continue;
        }
    }
    in.close();
    out.close();
    return 0;
}