Cod sursa(job #14321)

Utilizator pitradaPit-Rada Ionel-Vasile pitrada Data 8 februarie 2007 18:50:02
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include<fstream>
#include<math.h>
using namespace std;
fstream f,g;

long A[15001],B[130][130],C[130],N,M,i,j,x,y,z,K,s,s1,s2,t1,t2,i1,i2,l;
int main()
{
f.open("datorii.in",ios::in);
g.open("datorii.out",ios::out);

f>>N>>M;
K=(long)ceil(sqrt(1.0*N));

for (i=0;i<=K*K;i++) A[i]=0;//f.f.important-presupun ca este vorba de K*K zile

for (i=1;i<=N;i++) f>>A[i];

for (j=0;j<K;j++)
    {
    B[j][0]=0;
    for (i=j*K+1;i<=j*K+K;i++)
       B[j][i-j*K]=B[j][i-1-j*K]+A[i];
    if (j==0) C[j]=B[j][K];
       else C[j]=C[j-1]+B[j][K];
    }
for (i=1;i<=M;i++)
    {
    f>>x>>y>>z;
    if (x==0) 
      {
      A[y]=A[y]-z;
      j=y/K;
      B[j][0]=0;
      for (l=j*K+1;l<=j*K+K;l++)
        B[j][l-j*K]=B[j][l-1-j*K]+A[l];      
      if (j==0)C[j]=B[j][K];
         else for (l=j;l<K;l++)
                  C[l]=C[l-1]+B[l][K];
      }
      else
      {
      t1=y/K; t2=z/K; i1=y%K+1; i2=z%K+1;
      if (t1==t2)s=B[t2][i2]-B[t1][i1-1];
         else
         {
         s1=B[t1][K]-B[t1][i1-1];
         s2=B[t2][i2];
         s=C[t2-1]-C[t1];       
         s=s+s1+s2;
         }
      g<<s1+s+s2<<endl;
      }
   }

g.close();
f.close();
return 0;
}