Cod sursa(job #37926)

Utilizator damaDamaschin Mihai dama Data 25 martie 2007 13:05:42
Problema Distincte Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.32 kb
#include <stdio.h>
#include <algorithm>
#define modul 666013

using namespace std;

pair<int, int> v[100001];
int a[100001], arb[400001], st[400001], dr[400001], p2 = 1, n, k, m, pos[100001], used[100001], sol[100001];

bool cmp(int one, int two)
{
     return v[one].second < v[two].second;
}

void add(int val, int poz);
int query(int nod, int x, int y);

int main()
{
    freopen("distincte.in","r",stdin);
    freopen("distincte.out","w",stdout);

    int i, j;
    
    scanf("%d%d%d", &n, &k, &m);
    while(p2 < n)
             p2 <<= 1;
    
    for(i = 1; i <= n; ++i)
    {
          scanf("%d", &a[i]);
          st[p2 + i - 1] = dr[p2 + i - 1] = p2 + i - 1;
    }
    for(i = n + 1; i <= p2; ++i)
    {
          st[p2 + i - 1] = dr[p2 + i - 1] = p2 + i - 1;
    }
    
    for(i = p2 - 1; i > 0; --i)
    {
          st[i] = st[2 * i];
          dr[i] = dr[2 * i + 1];
    } 
    

    
    for(i = 1; i <= m; ++i)
    {
          scanf("%d%d", &v[i].first, &v[i].second);
          pos[i] = i;
    }
    
    sort(pos + 1, pos + m + 1, cmp);    
  
    for(i = 1, j = 1; i <= m; ++i)
    {
          
          for(; j <= v[pos[i]].second; ++j)
          {
                if(used[a[j]])
                {
                              add(-a[j], used[a[j]]);
                }
                add(a[j], p2 + j - 1);
          }
          
          sol[pos[i]] = query(1, p2 + v[pos[i]].first - 1, v[pos[i]].second + p2 - 1);
          //printf("%d %d\n", p2 + v[pos[i]].first - 1, p2 + v[pos[i]].second - 1);
    }
    
    for(i = 1; i <= m; ++i)
    {
          printf("%d\n", sol[i]);
    }
    
    return 0;
}


void add(int val, int poz)
{
     used[val] = poz;
     while(poz)
     {
              arb[poz] += val;
              if(arb[poz] >= modul)
                          arb[poz] -= modul;
              if(arb[poz] < 0)
                         arb[poz] += modul;
              poz >>= 1; 
     }
}

int query(int nod, int x, int y)
{
    int r = (st[nod] + dr[nod]) / 2;
    if(x == st[nod] && y == dr[nod])
         return arb[nod];
    if(y <= r)
    {
         return query(nod * 2, x, y);
    }
    if(x > r)
    {
         return query(nod * 2 + 1, x, y);
    }
    return query(nod * 2, x, r) + query(nod * 2 + 1, r + 1, y);
}