Mowa o zadaniu: http://pl.spoj.com/problems/FR_01_06/ ,napisałem bruta, ale kompletnie nie wiem jak to ruszyć aby wyszło coś sensownego. Proszę o jakieś słowa kluczowe, wskazówki itp, jak się za to w ogóle zabrać.
0
2
https://www.topcoder.com/tc?module=Static&d1=tutorials&d2=lowestCommonAncestor (Range Minimum Query)
0
Ehh.. mam problem, wydaje mi się, że robie wszystko dobrze, napisałem prosty generator testów i sprawdziłem czy wychodzi ok, ale dostaje błędna odpowiedź. Siedzę nad tym już kilka dni i nie mam pomysłu, wytni mi ktoś błąd:
#include <algorithm>
#include <ctime>
#include <cstdio>
#include <cmath>
using namespace std;
int n, c[1000001], q, o, a, b, v;
int tmin[1010], tmax[1010], p, r;
void minmax(int a, int b, int& min, int& max)
{
if (a == b) min = max = c[a];
else
{
if (c[a] > c[a+1]) { min = c[a+1]; max = c[a]; }
else { min = c[a]; max = c[a+1]; }
for (int i = a + 2; a < b; a += 2)
{
if (c[i] > c[i+1])
{
if (c[i] > max) max = c[i];
if (c[i+1] < min) min = c[i+1];
}
else
{
if (c[i+1] > max) max = c[i+1];
if (c[i] < min) min = c[i];
}
}
if ((b-a)%2 == 0)
{
if (c[b] > max) max = c[b];
if (c[b] < min) min = c[b];
}
}
}
int count(int a, int b)
{
if (a == b) return 0;
int min, max, smin, smax;
min = max = c[a];
if ((a % p != 0) && ((b+1) % p != 0) && (a/p == b/p))
{
minmax(a, b, min, max);
return max - min;
}
if (a % p != 0)
{
int b = ((a/p)*p)+p-1;
minmax(a, b, smin, smax);
if (smin < min) min = smin;
if (smax > max) max = smax;
a = b + 1;
}
if ((b+1) % p != 0)
{
int a = (b/p)*p;
minmax(a, b, smin, smax);
if (smin < min) min = smin;
if (smax > max) max = smax;
b = a - 1;
}
while (a < b)
{
if (tmin[a/p] < min) min = tmin[a/p];
if (tmax[a/p] > max) max = tmax[a/p];
a += p;
}
return max - min;
}
void add(int a, int b, int v)
{
for (int i = a; i <= b; i++) c[i] += v;
int min, max;
if ((a % p != 0) && ((b+1) % p != 0) && (a/p == b/p))
{
int aa = (a/p)*p, bb = aa+p-1;
minmax(aa, bb, min, max);
tmin[a/p] = min;
tmax[a/p] = max;
return;
}
if (a % p != 0)
{
int aa = (a/p)*p, bb = aa+p-1;
minmax(aa, bb, min, max);
tmin[a/p] = min;
tmax[a/p] = max;
a = bb + 1;
}
if ((b+1)%3 != 0)
{
int aa = (b/p)*p, bb = aa+p-1;
minmax(aa, bb, min, max);
tmin[b/p] = min;
tmax[b/p] = max;
b = aa - 1;
}
while (a < b)
{
tmin[a/p] += v;
tmax[a/p] += v;
a += p;
}
}
int main()
{
scanf("%d", &n);
p = sqrt(n);
for (int i = 0; i < n; i++)
{
scanf("%d", c + i);
if (i % p == 0) tmin[i/p] = tmax[i/p] = c[i];
if (c[i] < tmin[i/p]) tmin[i/p] = c[i];
else if(c[i] > tmax[i/p]) tmax[i/p] = c[i];
}
scanf("%d", &q);
while (q--)
{
scanf("%d%d%d", &o, &a, &b);
if (o == 0) printf("%d\n", count(a-1, b-1));
else
{
scanf("%d", &v);
add(a-1, b-1, v);
}
}
}