Cod sursa(job #259769)

Utilizator free2infiltrateNezbeda Harald free2infiltrate Data 15 februarie 2009 20:10:51
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <stdio.h>

int A[100001],B,S,k,x,n,m;

void update(int p,int val)
{
while (p<=n)
{
A[p]+=val;
p += p&(p^(p-1));
}
}

int sum(int p)
{
int S=0;
while (p>0)
{
S = S+A[p];
p -= p&(p^(p-1));
}
return S;
}

int min(int st,int dr)
{
int m,b;
if (st>dr) return -1;
else {
     m = (st+dr)/2;
     b = sum(m);
     if (b>S) return min(st,m-1);
     else if (b<S) return min(m+1,dr);
     else return m;
     }
}

int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
int i,j,p1,p2;

scanf("%d%d",&n,&m);

for (i=1;i<=n;i++) scanf("%d",&B),update(i,B);

for (i=1;i<=m;i++)
{
scanf("%d",&x);
if (x==0) {
          scanf("%d%d",&p1,&p2);
          update(p1,p2);
          }
else if (x==1) {
               scanf("%d%d",&p1,&p2);
               printf("%d\n",sum(p2)-sum(p1-1));
               }
else {
     scanf("%d",&S);
     printf("%d\n",min(1,n));
     }
}
}