Cod sursa(job #258201)

Utilizator bogdy92yMardare Bogdan-Mihai bogdy92y Data 14 februarie 2009 20:46:00
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <stdio.h>  
#include <string.h>  
  
#define in "aib.in"  
#define out "aib.out"  
#define dim 100001  
  
inline int minim(int a,int b){  
  if(a<b)return a;  
  return b;  
}  
  
FILE *f=fopen(in,"r"),*g=fopen(out,"w");  
  
int n,m,t;  
int arb[dim];  
int c,s;  
  
void actualizare(int,int);  
int interogare(int);  
int cautare(int);  
  
int main(){  
  memset(arb,0,sizeof(arb));  
  int k,x,y,i;  
  fscanf(f,"%d%d",&n,&m);  
  for(i=1;i<=n;i++){  
    fscanf(f,"%d",&t);  
    actualizare(i,t);  
    }  
  for(;m;m--){  
    fscanf(f,"%d",&k);  
    if(k<2){  
      fscanf(f,"%d%d",&x,&y);  
      if(!k)actualizare(x,y);  
      else fprintf(g,"%d\n",interogare(y)-interogare(x-1));  
    }  
    else{  
      fscanf(f,"%d",&x);  
      fprintf(g,"%d\n",cautare(x));  
  }  
}  
}  
  
void actualizare(int poz,int val){  
  c=0;  
  while (poz<=n){  
    arb[poz]+=val;  
    while(!(poz&(1<<c)))c++;  
    poz+=(1<<c);  
    c++;  
  }  
}  
  
int interogare(int poz){  
  c=0,s=0;  
  while(poz>0){  
      s+=arb[poz];  
      while(!(poz&(1<<c)))c++;  
      poz-=(1<<c);  
      c++;              
  }  
  return s;  
}  
  
int cautare(int val){  
  int i,step;  
  for(step=1;step<n;step<<=1);  
  for(i=0;step;step>>=1){  
    if(i+step<=n){  
      if(val>=arb[i+step])  
    {  
      i+=step,val-=arb[i];  
      if(!val)return i;  
    }  
    }  
  }  
  return -1;  
}