Cod sursa(job #1211399)

Utilizator rangerChihai Mihai ranger Data 22 iulie 2014 15:37:58
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>
using namespace std;
ifstream cin("aib.in");
ofstream cout("aib.out");
int aib[400010],a,b,n,m,op;

void update(int nod,int st,int dr,int poz,int val)
{
    if (st==dr) aib[nod]+=val;
      else
      {
          int m=(st+dr)/2;
          if (poz>=m+1) update(2*nod+1,m+1,dr,poz,val);
           else   update(2*nod,st,m,poz,val);
          aib[nod]+=val;
      }
}

int querry(int nod,int st,int dr,int a,int b)
{
    if (st==a && b==dr) return  aib[nod];
    int m=(st+dr)/2;
    if (a>=m+1) return querry(2*nod+1,m+1,dr,a,b);
    if (b<=m) return querry(2*nod,st,m,a,b);
    return querry(2*nod,st,m,a,m)+querry(2*nod+1,m+1,dr,m+1,b);

}

int main()
{
    cin>>n>>m;
    int x;
    for (int i=1;i<=n;i++) cin>>x, update(1,1,n,i,x);
    while (m--)
    {
        cin>>op;
        if (op==0)
        {
            cin>>a>>b;
            update(1,1,n,a,b);
        }  else
        if (op==1)
        {
            cin>>a>>b;
            cout<<querry(1,1,n,a,b)<<"\n";
        }  else
        {   cin>>a;
            int mij;
            int st=1,dr=n;
            while (st<=dr)
            {
                 mij=(st+dr)/2;
                int sum=querry(1,1,n,1,mij);
                if (sum==a) break;
                  else if (sum>a) dr=mij-1;
                    else st=mij+1;
            }
            cout<<mij<<"\n";
        }

    }
    return 0;
}