FREQUENT
segment tree
#include <iostream>
#include <algorithm>
#include <stdio.h>
#define sf(i) scanf("%d", &i)
#define pf(i) printf("%d\n", i)
#define pii pair<int, int>
#define mp make_pair
#define f first // value
#define s second //frequency
#define FOR(a, b) for(int i = a; i < b; i++)
using namespace std;
const int N = 100001;
struct node
{
pii m;
pii l;
pii r;
};
int n, q;
int arr[N];
node seg[4 * N];
node combine(node &a, node &b)
{
node res;
if(a.l.f == b.r.f) //if all the elements are same
{
res.l.f = res.r.f = res.m.f = a.l.f;
res.l.s = res.r.s = res.m.s = a.l.s + b.r.s;
}
else
{
res.l = a.l;
res.r = b.r;
if(a.l.f == b.l.f) //if first element of left is same as first element of right
{
res.l.s = a.l.s + b.l.s;
}
if(a.r.f == b.r.f)
{
res.r.s = a.r.s + b.r.s;
}
if(a.m.s > b.m.s)
res.m = a.m;
else
res.m = b.m;
if(a.r.f == b.l.f){
int temp = a.r.s + b.l.s;
if(temp > res.m.s){
res.m.f = a.r.f;
res.m.s = temp;
}
}
}
return res;
}
void buildTree(int l, int r, int index)
{
if(l == r)
{
seg[index].m = mp(arr[l], 1);
seg[index].l = mp(arr[l], 1);
seg[index].r = mp(arr[l], 1);
}
else
{
int mid = (l + r) / 2;
buildTree(l, mid, index * 2);
buildTree(mid + 1, r, (index * 2) + 1);
seg[index] = combine(seg[2 * index], seg[2 * index + 1]);
}
}
node query(int l, int r, int qs, int qe, int index)
{
if(qs <= l && (qe >= r))
return seg[index];
int mid = (l + r) / 2;
if(qe <= mid)
{
return query(l, mid, qs, qe, 2 * index);
}
if(qs > mid)
{
return query(mid + 1, r, qs, qe, 2 * index + 1);
}
node a = query(l, mid, qs, qe, 2 * index);
node b = query(mid + 1, r, qs, qe, 2 * index + 1);
return combine(a, b);
}
int main()
{
int qs, qe;
while(sf(n) == 1)
{
if(n == 0)
break;
sf(q);
FOR(1, n + 1)
{
sf(arr[i]);
}
buildTree(1, n, 1);
FOR(0, q)
{
sf(qs);
sf(qe);
node result = query(1, n, qs, qe, 1);
pf(result.m.s);
}
}
return 0;
}
Comments
Post a Comment