Cod sursa(job #1948464)

Utilizator alexoloieriAlexandru Oloieri alexoloieri Data 1 aprilie 2017 10:18:41
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <cstdio>
#define LMAX 100005

using namespace std;
FILE *fin=fopen("aib.in","r");
FILE *fout=fopen("aib.out","w");

int s[LMAX];
int lsb[LMAX];
int aib[LMAX];
int n;

int sum(int poz);
int pozmin(int suma);

int main()
{
int i;
int m, a;
int c;
int x, y;
int yp;
int s1, s2;
fscanf(fin,"%d %d",&n,&m);
for (i=1;i<=n;i++)
     {
      fscanf(fin,"%d",&a);
      s[i]=a+s[i-1];
     }
for (i=1;i<=n;i++)
     lsb[i]=(i&(-i));
for (i=1;i<=n;i++)
     aib[i]=s[i]-s[i-lsb[i]];
for (i=1;i<=m;i++)
    {
     fscanf(fin,"%d",&c);
     if (c==0)
         {
          fscanf(fin,"%d %d",&x,&y);
          for (yp=x;yp<=n;yp+=lsb[yp])
               aib[yp]+=y;
         }
         else if (c==1)
                {
                 fscanf(fin,"%d %d",&x,&y);
                 s1=sum(x-1);
                 s2=sum(y);
                 fprintf(fout,"%d\n",s2-s1);
                }
                else
                {
                 fscanf(fin,"%d",&x);
                 fprintf(fout,"%d\n",pozmin(x));
                }
    }
fclose(fin);
fclose(fout);
return 0;
}

int sum(int poz)
    {
     int sum=0;
     for (;poz>=1;poz-=lsb[poz])
          sum+=aib[poz];
     return sum;
    }

int pozmin(int suma)
    {
     int st, dr;
     int m;
     int suu;
     int pm=2*n;
     st=0;
     dr=n+1;
     while (st<=dr)
         {
          m=(st+dr)/2;
          suu=sum(m);
          if (suu==suma)
             {
              if (m<pm)
                  pm=m;
              dr=m-1;
             }
             else if (suu>suma)
                    dr=m-1;
                    else st=m+1;
         }
     return pm;
    }