Cod sursa(job #364728)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 16 noiembrie 2009 20:27:21
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.25 kb
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>

using namespace std;

#define nm 3502
#define PB push_back
#define MKP make_pair
#define FOR(i,a,b)for(i=(a);i<=(b);++i)
#define Y second.first
#define Z second.second
#define lsb(x)(((x)^(x-1))&x)


int N,T,AIB[nm][nm];

vector<pair<int,pair<int,int> > > E;

inline void update_line(int line,int column,int val)
{
     while(column<=N)
     {
       AIB[line][column]=max(AIB[line][column],val);
       column+=lsb(column);
     }
}

void update(int line,int column,int val)
{
     while(line<=N)
     {
       update_line(line,column,val);
       line+=lsb(line);
     }
}

inline void back_update_line(int line,int column)
{
     while(column<=N)
     {
       AIB[line][column]=0;
       column+=lsb(column);
     }
}

void back_update(int line,int column)
{
     while(line<=N)
     {
       back_update_line(line,column);
       line+=lsb(line);
     }
}

inline int query_line(int line,int column)
{
     int ans=0;
     
     while(column)
     {
       ans=max(AIB[line][column],ans);
       column-=lsb(column);
     } 
     
     return ans;
}

int query(int line,int column)
{
     int ans=0;
     
     while(line)
     {
       ans=max(query_line(line,column),ans);
       line-=lsb(line);
     }
     
     return ans;
}

int main()
{
    int x,y,z,i,j;
    
    freopen("cutii.in","r",stdin);
    freopen("cutii.out","w",stdout);
    
    scanf("%d %d",&N,&T);
    
    FOR(i,1,T)
    {
      int best=0;        
      
      E.clear();
              
      FOR(j,1,N)
      {
        scanf("%d %d %d",&x,&y,&z);
        E.PB(MKP(x,MKP(-y,-z)));
      }
      
      sort(E.begin(),E.end());
      
      FOR(j,0,N-1)
      {
        //find out the answer for B[j+1]
        
        y=-E[j].Y;
        z=-E[j].Z;
        
        int ansc=query(y-1,z-1)+1;
        
        best=max(ansc,best);
        
        //update the BIT with the current solution
        
        update(y,z,ansc);
      }         
      
      printf("%d\n",best);
      
      FOR(j,0,N-1)
      {
        y=-E[j].Y;
        z=-E[j].Z;
        
        back_update(y,z);
      }
    }
    
    return 0;
}