Cod sursa(job #180290)

Utilizator stefanrStefan Ruseti stefanr Data 16 aprilie 2008 20:42:35
Problema Marbles Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.52 kb
#include<fstream.h>
ifstream fin("marbles.in");
ofstream fout("marbles.out");

struct nod
{int li,ls,c[65];
 nod *st,*dr;
}*r;

struct bila
{int p,c;}v[100001];

int n,m,cmax;

void schimba(nod *p,int i,int j)
{if(p->ls-p->li<=2)
  {for(int g=p->li;g<=p->ls;g++)
    if(v[g].p==i) v[g].p+=j;
  }
 else
  {int k=(p->li+p->ls)/2;
   if(v[k].p<i) schimba(p->dr,i,j);
   else schimba(p->st,i,j);
  }
}

nod * construieste(int i,int j)
{nod *p;
p=new nod;
p->li=i;
p->ls=j;
int g;
for(g=1;g<=cmax;g++) p->c[g]=0;
if(j-i<=2)
 {for(g=i;g<=j;g++) p->c[v[g].c]++;
  p->st=p->dr=NULL;
  return p;
 }
int k=(i+j)/2;
p->st=construieste(i,k);
p->dr=construieste(k+1,j);
for(g=1;g<=cmax;g++) p->c[g]=p->st->c[g]+p->dr->c[g];
return p;
}

nod *adauga(nod *a,nod *b)
{nod *p;
p=new nod;
p->li=a->li;
p->ls=b->ls;
for(int i=1;i<=cmax;i++) p->c[i]=a->c[i]+b->c[i];
delete a;
delete b;
return p;
}

nod * copiaza(nod *x)
{nod *p;
p=new nod;
p->st=x->st;
p->dr=x->dr;
for(int i=1;i<=cmax;i++) p->c[i]=x->c[i];
return p;
}

nod * creare(int i)
{nod *p;
 p=new nod;
 p->li=i;
 p->ls=i;
 int g;
 for(g=1;g<=cmax;g++) p->c[g]=0;
 p->c[v[i].c]=1;
 return p;
}

nod * cauta(nod *p,int i,int j)
{if(i<=v[p->li].p && j>=v[p->ls].p) return copiaza(p);
 int k=(p->li+p->ls)/2;
 if(j<v[k+1].p && i>v[k].p) return NULL;
 if(j<v[k+1].p)
  {if(p->st==NULL) return creare(k);
   return cauta(p->st,i,j);
  }
 if(i>v[k].p)
  {if(p->dr==NULL) return creare(k+1);
   return cauta(p->dr,i,j);
  }
 nod *a,*b;
 if(p->st==NULL) a=creare(k);
 else a=cauta(p->st,i,v[k].p);
 if(p->dr==NULL) b=creare(k+1);
 else b=cauta(p->dr,v[k+1].p,j);
 return adauga(a,b);
}

int poz(int i,int j)
{bila aux;
int i1[2]={0,1},j1[2]={-1,0},k=0;
while(i<j)
 {if(v[i].p>v[j].p)
   {aux=v[i];
    v[i]=v[j];
    v[j]=aux;
    k++;
   }
  i+=i1[k%2];
  j+=j1[k%2];
 }
return i;
}

void sortare(int i,int j)
{if(i<j)
  {int k=poz(i,j);
   sortare(i,k);
   sortare(k+1,j);

  }
}

int main()
{fin>>n>>m;
int i,j,max,x,y,z;
nod *p;
for(i=1;i<=n;i++)
 {fin>>v[i].p>>v[i].c;
  if(v[i].c>cmax) cmax=v[i].c;
 }
sortare(1,n);
r=construieste(1,n);
for(i=1;i<=m;i++)
 {fin>>x>>y>>z;
  if(x==0) schimba(r,y,z);
  else
   {if(y>r->ls || z<r->li) fout<<"0\n";
    else
     {p=cauta(r,y,z);
      if(p==NULL) fout<<"0\n";
      else
       {max=0;
        for(j=1;j<=cmax;j++)
         if(p->c[j]>max) max=p->c[j];
        fout<<max<<"\n";
       }
      delete p;
     }
   }
 }
fin.close();
fout.close();
}