Cod sursa(job #1211960)

Utilizator vasica38Vasile Catana vasica38 Data 23 iulie 2014 16:17:26
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include<fstream>
using namespace std;

int a[100009],i,j,k,x,y,n,m;
ifstream cin("aib.in");
ofstream cout("aib.out");

void update(int poz, int u)
{
     while (poz<=n) 
           {
           a[poz]+=u;
           poz+=(poz&(-poz));
           }
}

int suma(int poz)
{
    int sol=0;
    while (poz>=1)
          {
          sol+=a[poz];
          poz-=(poz&(-poz));
          }
    return sol;
}

int search(int x)
{
    int right=n;
    int left=1;
    while (left <=right)
    {
          int mijl=(left+right)/2;
          int s=suma(mijl);
          if (s==x) return mijl;
             else
             if (s>x)  right=mijl-1;
                else left=mijl+1;
    }
return -1;
}

int main()
{
    cin>>n>>m;
    for (i=1; i<=n ; i++) {
              cin>>x;
              update(i,x);
                          }
    for (i=1 ; i<=m ; i++) 
        {
              cin>>k;
              if (k==0) {
                        cin>>x>>y;
                        update(x,y);
                        }
              if (k==1) {
                        cin>>x>>y;
                        cout<<suma(y)-suma(x-1)<<"\n";
                        }
              if (k==2) {
                        cin>>x;
                        cout<<search(x)<<"\n";
                        }
        }
cin.close();
cout.close();
return 0;
}