Cod sursa(job #92351)

Utilizator megabyteBarsan Paul megabyte Data 14 octombrie 2007 23:30:39
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
// AiB

//#include <iostream>
#include <cstdio>
#define INF "datorii.in"
#define OUF "datorii.out"
#define NMAX 16384
using namespace std;

int t[NMAX]={0},n,val;

void insert(int poz)// updatez toate intervalele ce il contin pe t[poz]
{
     int p,r;
     p=poz;r=0;
     while(p<=n)
     {
         t[p]+=val;
         //printf("%d ",p);
         while((p&(1<<r))==0) ++r;
         p=p+(1<<r);
         ++r;
     }
     //printf("\n");
}

int query(int poz)// interoghez intervalul [1,poz]
{
    int p,r,sol=0;
    p=poz;r=0;
    while(p>0)
    {
         sol+=t[p];
         while((p&(1<<r))==0) ++r;
         p-=(1<<r);
         ++r;
    }
    return sol;
}

int main()
{
    FILE *in,*out;
    in=fopen(INF,"r");
    out=fopen(OUF,"w");
    int a,b,c,m,i,s1,s2;
    fscanf(in,"%d%d",&n,&m);
//    val=2;insert(1);
    for(i=1;i<=n;++i)
    {
                      fscanf(in,"%d",&val);
                      //v[i]=val;
                      insert(i);
       //               printf("%d\n ",t[i]);
    }
    //printf("%d\n");
    for(i=1;i<=m;++i)
    {
                     fscanf(in,"%d%d%d",&a,&b,&c);
         //            printf("%d %d %d\n",a,b,c);
                     if(a)
                     {
                          s1=query(c);
                          s2=query(b-1);
                          fprintf(out,"%d\n",s1-s2);
                     }
                     else
                     {
                         val=c*(-1);
                         insert(b);
                         
                     }
    }
    //system("pause");
    fclose(in);fclose(out);
    return 0;
}