Cod sursa(job #14286)

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

struct per{ int zi,v;};
int A[15001],N,M,i,j,x,y,z,s,vf;
per V[100001];
int st[100001],dr[100001],rad,ok,p,q,dir;

long ss(int p, int y, int z)
{
if (p==0) return 0;
if (V[p].zi<y) return ss(dr[p],y,z);
if (V[p].zi>z) return ss(st[p],y,z);
return V[p].v+ss(st[p],y,z)+ss(dr[p],y,z);
}

int main()
{
f.open("datorii.in",ios::in);
g.open("datorii.out",ios::out);

f>>N>>M;
A[0]=0;
for (i=1;i<=N;i++)
  {
  f>>x;
  A[i]=A[i-1]+x;
  }
rad=0;
for (i=1;i<=M;i++){st[i]=0;dr[i]=0;}
vf=0;
for (i=1;i<=M;i++)
  {
  f>>x>>y>>z;
  if (x==0) 
     {
     if (rad==0) 
       { rad=1;}
        else
       {
       p=rad;
       ok=1;
       while (ok)
         { 
          if (y<V[p].zi) {dir=0;q=st[p];}
             else if (y>V[p].zi)
                     {dir=1; q=dr[p];}
                      else {dir=2;V[p].v+=z;q=0;}
          if (q==0)ok=0;
             else p=q;
         }
       if (dir==0) 
          {vf++; V[vf].zi=y; V[vf].v=z; st[p]=vf;}
          else if (dir==1)
                  {vf++; V[vf].zi=y; V[vf].v=z; dr[p]=vf;}
       }
     }
     else
     {
     s=A[z]-A[y-1]-ss(rad,y,z);
     g<<s<<endl;
     }
  }


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