Pagini recente » Cod sursa (job #245328) | Cod sursa (job #592389) | Cod sursa (job #2319564) | Cod sursa (job #453432) | Cod sursa (job #87675)
Cod sursa(job #87675)
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#define MAX 3600
#define max(a, b) ((a) > (b) ? (a) : (b))
using namespace std;
typedef struct {
int x,y,z;
} pc;
bool operator< (const pc &p1, const pc &p2)
{
return p1.z < p2.z;
};
int N,T, best[MAX];
pc p[MAX];
short int aib[MAX][MAX];
void update(int v, int x, int y, int k) //aduna v la elementul de pe pozitia x,y
{
int i,j;
for (i = x; i <=N; i+= ( i ^ (i-1)) & i) // i = 2 la puterea k ( k-nr zerourilor terminale din reprezentarea binara a lui i)
for (j = y; j<=N; j+= (j ^ (j-1)) & j )
{
aib[i][j]=max(aib[i][j],v);
if (k) aib[i][j] = 0;
};
}
int query(int x, int y) // returneaza suma elementelor din matricea cu colturile [1,1] si [x,y]
{
int sum = 0;
for (int i = x; i>0; i-=( i ^ (i-1)) &i )
for (int j = y; j>0; j-=( j ^ (j-1)) & j)
sum = max(aib[i][j],sum);
return sum;
}
int main()
{
freopen("cutii.in", "r", stdin);
freopen("cutii.out", "w", stdout);
scanf("%d%d\n", &N, &T);
for (int t = 0; t<T; t++)
{
for (int i =0; i<N; i++)
scanf("%d%d%d\n", &p[i].x, &p[i].y, &p[i].z);
sort(p,p+N);
//memset(best,1,sizeof(best));
update(1,p[0].x, p[0].y, 0);
int rez;
for (int i = 1; i<N; i++)
{
rez = query(p[i].x, p[i].y) + 1;
update(rez, p[i].x, p[i].y, 0);
};
rez = query(N,N);
printf("%d\n", rez);
for (int i = 0; i<N; i++)
update(0,p[i].x, p[i].y,1);
}
fclose(stdin); fclose(stdout);
return 0;
};