Cod sursa(job #280501)

Utilizator SoRReLLIftode Bogdan Marius SoRReLL Data 13 martie 2009 13:39:03
Problema Arbori indexati binar Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.33 kb
#include<iostream.h>
#include<fstream.h>

int a[100001];
long n,m;
fstream in("aib.in",ios::in);
fstream out("aib.out",ios::out);

void prelucrare();
void prelucrare0(long,long);
long prelucrare1(long,long);
long prelucrare2(long);

 int search(int sum){  
     int st,dr,mj,s;  
     st=1;dr=n;  
     while(st<=dr){  
         mj = (st+dr)>>1;  
         s=prelucrare1(1,mj);  
         if(s > sum) dr=mj-1;  
         else st=mj+1;  
     }  
         if(prelucrare1(1,dr)!=sum)return -1;  
         return dr;  
 }  

void citire()
{
     in>>n>>m;
     for(long i=1;i<=n;i++)
              in>>a[i];
     prelucrare();
}

void prelucrare()
{
     for(long i=1;i<=m;i++)
              {
                           int opt;
                           in>>opt;
                           if(opt==0)
                                     {
                                            long x,y;
                                            in>>x>>y;
                                            prelucrare0(x,y);
                                     }
                           else if(opt==1)
                                          {
                                                             long x,y;
                                                             in>>x>>y;
                                                             out<<prelucrare1(x,y)<<"\n";
                                          }
                                else if(opt==2)
                                               {
                                                             long x;
                                                             in>>x;
                                                             out<<search(x)<<"\n";
                                               }
              }
}
                                            
void prelucrare0(long x,long y)
{
     a[x]+=y;
}

long prelucrare1(long x,long y)
{
     long s=0;
     for(long i=x;i<=y;i++)
              s+=a[i];
     return s;
}

long prelucrare2(long x)
{
     long s=0,i;
     for(i=1;i<=n;i++)
              {
                           s+=a[i];
                           if(s>=x) break;
              }
     if(s==x)
             return i;
     else return -1;
}

int  main()
{
     citire();
     return 0;
}