Cod sursa(job #1207450)

Utilizator tudi98Cozma Tudor tudi98 Data 13 iulie 2014 03:53:18
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <fstream>
#include <cstring>
using namespace std;
#define dim 3501

struct P{int x,y,z;};
int AIB[dim][dim],n,val,t;
char Last[dim][dim];
P a[dim];

inline int max(int a,int b){
    return (a>b?a:b);
}

void update(int idx1,int idx2){
    for(int i=idx1;i<=n;i+=(i & -i))
        for(int j=idx2;j<=n;j+=(j & -j))
            if(Last[i][j]==t)
                AIB[i][j]=max(AIB[i][j],val);
            else AIB[i][j]=val,Last[i][j]=t;
}

int query(int idx1,int idx2){
    int Val=0;
    for(int i=idx1;i>0;i-=(i & -i))
        for(int j=idx2;j>0;j-=(j & -j))
            if(Last[i][j]==t) Val=max(AIB[i][j],val);
    return Val;
}

int main(){

    ifstream f("cutii.in");
    ofstream g("cutii.out");

    int best=0;
    f >> n >> t;
    while(t--){
        best=0;
        for(int i=1;i<=n;i++){
            int x,y,z;
            f >> x >> y >> z;
            a[z].x=x,a[z].y=y,a[z].z=z;
        }
        for(int i=1;i<=n;i++){
            val=query(a[i].x-1,a[i].y-1)+1;
            if(val>best) best=val;
            update(a[i].x,a[i].y);
        }
        g << best << "\n";
    }
}