Pagini recente » Cod sursa (job #2080165) | Cod sursa (job #2647530) | Cod sursa (job #2537878) | Cod sursa (job #1063941) | Cod sursa (job #1481550)
#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;
}
}