Cod sursa(job #1481550)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 4 septembrie 2015 19:16:18
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <stdio.h>
#include <vector>
#define MAX 1005
using namespace std;

int n, x[MAX], i, j, nr, rez, p[MAX], q[MAX], l, cnt;
vector< pair<int, int> > v[MAX];

int bs(int l, int x);

int main(){
	freopen("subsiruri.in", "r", stdin);
	freopen("subsiruri.out", "w", stdout);
	scanf("%d", &n);
	for(i = 0; i < n; i++){
		scanf("%d", &x[i]);
		p[i] = bs(l, x[i]);
		q[p[i]] = x[i];
		if(l < p[i])
			l = p[i];
	}
	for(i = 0; i < n; i++){
		if(p[i] == 1){
			v[1].push_back(make_pair(x[i], 1));
		}
		else{
			nr = 0;
			for(j = 0; j < v[p[i] - 1].size(); j++)
				if(v[p[i] - 1][j].first < x[i])
					nr = (nr + v[p[i] - 1][j].second) % 9901;
			if(p[i] == l){
				cnt++;
				rez = (rez + nr) % 9901;
			}
			else{
				v[p[i]].push_back(make_pair(x[i], nr));
			}
		}
	}

	printf("%d\n%d\n", l, rez);
	return 0;
}

int bs(int l, int x){
	if(l == 0)
		return 1;

	int s = 1, d = l, m;
	while(s < d){
		m = (s + d) / 2;
		if(q[m] == x)
			return m;
		if(q[m] > x){
			if(m == 1)
				return m;
			if(q[m - 1] < x)
				return m;
			else
				d = m - 1;
		}
		else
			s = m + 1;
	}

	if(s == d){
		if(q[s] == x)
			return s;
		if(q[s] > x){
			if(s == 1)
				return s;
			if(q[s - 1] < x)
				return s;
			else
				return l + 1;
		}
		else
			return l + 1;
	}
}