Cod sursa(job #180602)

Utilizator Stingacianu.VladStingacianu Vlad Stingacianu.Vlad Data 17 aprilie 2008 11:28:22
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.42 kb
#include<stdio.h>
long a[32800],st[32800],dr[32800],n,m,x,y,z,zero=1,fs,fd,tata;
long query(long p);
int main()
{
    long i;
	freopen("datorii.in","r",stdin);
	    freopen("datorii.out","w",stdout);
		scanf("%ld %ld",&n,&m);
		    while(zero<n)
			    zero<<=1;
				zero--;
				    for(i=zero+1;i<=zero+n;++i){
					    st[i]=i-zero;
						    dr[i]=i-zero;
							    scanf("%ld",&a[i]);
								}
								    for(i=n+1;i<=zero+1;++i){
									    st[zero+i]=i;
										    dr[zero+i]=i;
											}
											    for(i=zero;i>=1;--i){
												    fs=i<<1;
													    fd=fs|1;
														    st[i]=st[fs];
															    dr[i]=dr[fd];
																    a[i]=a[fs]+a[fd];
																	}
																	    for(;m;m--){
																		    scanf("%ld %ld %ld",&x,&y,&z);
																			    if(x)
																					printf("%ld\n",query(1));
																						else{
																							    a[zero+y]-=z;
																									tata=(zero+y)>>1;
																										    do{
																												    a[tata]=a[tata<<1]+a[(tata<<1)|1];
																														    tata>>=1;
																																}while(tata);
																																	}
																																	    }
																																		fcloseall();
																																		    return 0;
																																		    }
																																		    long query(long p)
																																		    {
																																			long m1,m2;
																																			    if(y>dr[p])
																																				    return 0;
																																					if(z<st[p])
																																						return 0;
																																						    if(y<=st[p] && z>=dr[p])
																																							    return a[p];
																																								m1=query(p<<1);
																																								    m2=query((p<<1)|1);
																																									m1=m1+m2;
																																									    return m1;
                                                                                                                                                                                                                                                                                                                                            }