Cod sursa(job #170146)

Utilizator ErgoVicol Sergiu Constantin Ergo Data 2 aprilie 2008 14:02:51
Problema Marbles Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
//Marbles
#include <fstream>
#include <algorithm>
#include <iostream>
using namespace std;
struct Citire{
	int c;
      int p;
};
int  Ordine(Citire i,Citire j){
	return (i.p<j.p);
}
int A[65][100011];
char dbg;

int  Cautare (int p,int u,int el){
//	fprintf(stdout,"%d ",el); cin>>dbg;
      if (p>u) return -1;
	int m=(p+u)/2;
      if (el==A[0][m]) return m;
      if (el<A[0][m]) return Cautare(p,m-1,el);
      return Cautare(m+1,u,el);

}
int Cautare2 (int p, int u, int el){
//	fprintf(stdout,"p= %d u=%d el=%d",p,u,el); cin>>dbg;
	if (p>u) return -1;
      int m=(p+u)/2;
//    fprintf(stdout,"A[0][m]= %d %d",A[0][m],A[0][m+1]); cin>>dbg;
      if (A[0][m]<=el&&el<A[0][m+1]) return m;
      if (el<A[0][m]) return Cautare2(p,m-1,el);
      return  Cautare2(m+1,u,el);
}
int main(){
      Citire B[100001];
	ifstream fin("marbles.in");
      ofstream fout("marbles.out");
      int i,j,C,n,m,nr,x,y,St,Sf,Max;

      fin>>n>>m;

      for (i=1;i<=n;i++){
         	fin>>B[i].p>>B[i].c;
      }
	sort(B+1,B+n+1,Ordine);
      for (i=1;i<=n;i++){
      	A[0][i]=B[i].p;
            A[B[i].c][i]=1;
            for (j=1;j<=64;j++)
               	A[j][i]+=A[j][i-1];
      }
	A[0][0]=-214748364;
	A[0][n+1]=214748364;
      for (j=1;j<=m;j++){
      	fin>>C>>x>>y;
//          St=Cautare(1,n,x);
            if (C==0){
              	St=Cautare(1,n,x);
            	A[0][St]=x+y;
            }
      	if (C==1){
            Max=-10000;
            St=Cautare2(0,n+1,x);
            Sf=Cautare2(0,n+1,x+y);
            if (A[0][St]!=x) St++;
//          fprintf(stdout,"ST SF %d %d \n",St,Sf); cin>>dbg;
            for (i=1;i<=64;i++)
               	if (A[i][Sf]-A[i][St-1]>Max)
                    	Max=A[i][Sf]-A[i][St-1];
            fout<<Max<<'\n';
            }
//          fout<<St<<' ';
      }
//	fout<<'\n';
//      for (i=1;i<=n;i++) fout<<A[0][i]<<' ';
      fout.close();
      return 0;

}