Nu aveti permisiuni pentru a descarca fisierul grader_test1.in
Cod sursa(job #152392)
Utilizator | Data | 9 martie 2008 13:51:20 | |
---|---|---|---|
Problema | Arbori de intervale | Scor | 40 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.27 kb |
#include <stdio.h>
#define Nmax 111111
#define KKK 256
#define XXX KKK-1
#define W if (t[i] > MAX[i/KKK]) MAX[i/KKK] = t[i]; ++i;
#define Q W W W W W W W W W W W W W W W W
#define UPDATE i=(i/KKK)*KKK; Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q
#define T if (i&XXX == 0 && i+KKK <= b) { if (ret < MAX[i/KKK]) ret = MAX[i/KKK]; i+=KKK; } else if (ret < t[i] && i<=b) ret = t[i]; ++i;
#define R T T T T T T T T T T T T T T T T T T T T T T
#define E R R R R R R R R R R R R R R R R R R R R R R
int t[Nmax], n,m, MAX[Nmax/KKK];
void update(int i,int x)
{
if (t[i]^MAX[i/KKK])
{
t[i] = x;
if (t[i] > MAX[i/KKK]) MAX[i/KKK] = t[i];
}
else
{
t[i] = x;MAX[i/KKK]=-1;
UPDATE
}
}
int search(int a,int b)
{
int ret=-1;
for (int i=a;i<=b;)
{
E
}
return ret;
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d", &n,&m);
int i,x=1,a,b;
for (i=0;i<n;++i)
{
scanf("%d", &t[i]);
if (MAX[i/KKK] < t[i]) MAX[i/KKK] = t[i];
}
for (i=1;i<=m;++i)
{
scanf("%d%d%d", &x,&a,&b);
if (x==0)
printf("%d\n", search(a-1,b-1));
else update(a-1,b);
}
return 0;
}