Cod sursa(job #1824414)

Utilizator stefzahZaharia Stefan Tudor stefzah Data 7 decembrie 2016 20:19:08
Problema Arbori indexati binar Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n,m,i,j,a[100005],v[400005],p=1,p1,Q,S;
int Quest(int q,int x,int y,int st,int dr)
     {int mid=(st+dr)/2;
      if(x==st&&y==dr)return v[q];
       else{if(y<=mid)return Quest(q*2,x,y,st,mid);
            if(x>mid)return Quest(q*2+1,x,y,mid+1,dr);
            return Quest(q*2,x,mid,st,mid)+Quest(q*2+1,mid+1,y,mid+1,dr);
           }
     }
void Quest1(int st,int dr,int q)
           {int mid=(st+dr)/2;
            if(st==dr){Q=st;}
            else{if(v[q*2]<S){S=S-v[q*2];Quest1(mid+1,dr,q*2+1);}
                  else Quest1(st,mid,q*2);
                }
           }
int main()
{int x,y,x1,y1;
 fin>>n>>m;
 for(i=1;i<=n;i++)
    fin>>a[i];
 while(p<n)p=p*2;
 for(i=p;i<=p+n-1;i++)
    v[i]=a[i-p+1];
 for(i=p-1;i>=1;i--)
    v[i]=v[i*2]+v[i*2+1];
 for(i=1;i<=m;i++)
    {fin>>p1;
     if(p1==0){fin>>x>>y;
              x1=x+p-1;
              while(x1!=0)
                   {v[x1]=v[x1]+y;
                    x1=x1/2;
                   }
             }
     else if(p1==1){fin>>x>>y;
                    fout<<Quest(1,x,y,1,p)<<"\n";
                   }
     else if(p1==2){fin>>S;
                    Quest1(1,p,1);
                    if(S==a[Q])fout<<Q<<"\n";
                    else fout<<"-1\n";
                   }
    }
}