Cod sursa(job #365790)

Utilizator doru.nituNitu Doru Constantin doru.nitu Data 19 noiembrie 2009 23:06:10
Problema Datorii Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include<stdio.h>

int i,j,a[100100],n,m,x,p,q,poz,val,rez;

inline int actual(int st,int dr,int i)
{ 
	if(st == dr) { a[i]=val;
	
	               return 0;
	
			   }
    int mij = ( st + dr ) / 2; 
	
    if(poz <= mij) actual( st , mij , i*2) ;
	
    else actual ( mij+1 , dr , i*2+1 );
	
    a[i]=(a[i*2]+a[i*2+1]);
	
    return 0;
	
}
 
inline int update(int st,int dr,int i)
{ 
	if(st == dr) { a[i]-=val;
	
	               return 0;
	  
				 }
	
    int mij = ( st + dr ) / 2;
	
    if(poz <= mij) update( st , mij , i*2);
	
    else update ( mij+1 , dr , i*2+1);
	
    a[i]=(a[i*2]+a[i*2+1]);
	
    return 0;
	
}

inline int Search(int st,int dr,int i)
{ 
	if(p <= st && dr <= q) { rez+=a[i];
							 return 0;
	
						   }
	
	int mij = ( st + dr )/2;
	
	if(p <= mij) Search ( st , mij , i*2 );
	
	if(q > mij) Search( mij+1 , dr ,i*2+1);
	
	return 0;
	
}

int main()
{ 
	freopen("datorii.in","r",stdin);
	freopen("datorii.out","w",stdout);
	
	scanf("%d %d",&n,&m);
	
	
	for(i=1 ; i<=n ; i++) { scanf("%d",&val);
	 
	                       if(val) {  poz = i; 
	                        
	                                  actual(1,n,1);
	                               }
	                      } 
		
	for(i=1;i<=m;i++) { scanf("%d %d %d",&x,&p,&q);
	                   
	                    if(x) { rez=0;
	
	                            Search(1,n,1);
						        
                                printf("%d\n",rez); 
						      }
                        
                        else { val = q;
						
                               poz = p;
              
                               update(1,n,1);
						     }
	                  }		
					

	fclose(stdin);
	fclose(stdout);
	return 0;
	}