Cod sursa(job #63911)

Utilizator floringh06Florin Ghesu floringh06 Data 31 mai 2007 14:51:29
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
// Arbori indexati binar 
// Complexitate m*log n cu optimizari + calcul integral pe biti
using namespace std;

#define MAX_N 1<<13

#include<stdio.h>

FILE *fin=fopen("datorii.in","r"),
     *fout=fopen("datorii.out","w");
     
int a[MAX_N<<1],c[MAX_N<<1];
int n,m,i,SUM,k;

void buildtree(void) //construiesc arborele
{
  int i,p;
  for (i=1; i<=n; i++)  {
     p=i^(i&(i-1)); c[i]=a[i]-a[i-p]; }  
}

void update(int a, int b) //actualizare in log n
{
    int p=0;
    while (a<=n) {
      c[a]-=b; p=a^(a&(a-1));
      a+=p; }
}        
  
void query(int a, int b) // determin in max(log n) suma in intervalul (a,b)
{
     int p=0,a1=a-1,b1=b;
     int sa=0,sb=0;
     while (a1>0) {
       sa+=c[a1]; p=a1^(a1&(a1-1));
       a1-=p; }
     p=0;
     while (b1>0) {
       sb+=c[b1]; p=b1^(b1&(b1-1));
       b1-=p; }
     SUM=sb-sa;  
}   

int main()
{
   fscanf(fin,"%d %d",&n,&m);
   for (i=1; i<=n; i++) 
    { 
     fscanf(fin,"%d",&k);
     a[i]=a[i-1]+k;
    } 
   buildtree();
   int t,a,b;
   for (i=1; i<=m; i++)
    {
      fscanf(fin,"%d %d %d",&t,&a,&b);
      if (t==0) update(a,b);
         else 
          {
	       query(a,b);
           fprintf(fout,"%d\n",SUM);
          } 
    }
fclose(fin); fclose(fout);
return 0;
}