Cod sursa(job #37927)

Utilizator wefgefAndrei Grigorean wefgef Data 25 martie 2007 13:06:05
Problema Distincte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.2 kb
#include <cstdio>
#include <algorithm>

using namespace std;

#define Nmax 100005
#define Amax 262145
#define x second.first
#define y first
#define z second.second
#define mod 666013

int n, k, m, a, b, vl;
int sir[Nmax], p[Nmax], prev[Nmax], ai[Amax];
pair<int, pair<int, int> > inv[Nmax];

void citire()
{
    int i;
    
    scanf("%d %d %d", &n, &k, &m);
    
    for (i = 1; i <= n; ++i)
        scanf("%d", &sir[i]);
    
    for (i = 1; i <= m; ++i)
    {
        scanf("%d %d", &inv[i].x, &inv[i].y);
        inv[i].z = i;
    }
}

void update(int nod, int st, int dr)
{
    if (a <= st && dr <= b)
    {
        ai[nod] += vl;
        
        if (ai[nod] >= mod)
            ai[nod] -= mod;
        if (ai[nod] < 0)
            ai[nod] += mod;
        return;
    }
    else
    {
        int mij = (st + dr) / 2;
        
        if (a <= mij)
            update(nod*2, st, mij);
        
        if (mij < b)
            update(nod*2+1, mij + 1, dr);
    }
}

int query(int nod, int st, int dr)
{
    int t = ai[nod];
    
    if (st == dr)
       return t;
    else
    {
        
        int mij = (st + dr) / 2;
        
        if (a <= mij)
            t += query(nod*2, st, mij);
        else
            t += query(nod*2+1, mij + 1, dr);
        
        if (t >= mod)
            t -= mod;
            return t;
    }
}

void solve()
{
    int i, ind, q;
    
    
    sort(inv + 1, inv + m + 1);
    
    ind = 1;
    for (i = 1; i <= n; ++i)
    {
        q = sir[i];
        
        if (prev[q])
        {
            a = 1;
            b = prev[q];
            vl = -q;
            update(1, 1, n);
        }
        
        a = 1;
        b = i;
        vl = q;
        
        update(1, 1, n);
         
        while (ind <= m && inv[ind].y == i)
        {
            a = inv[ind].x;
            p[ inv[ind].z ] = query(1, 1, n);
            ++ind;
        }

         prev[q] = i;
     }
     
    for (i = 1; i <= m; ++i)
        printf("%d\n", p[i]);
}

int main()
{
    freopen("distincte.in", "r", stdin);
    freopen("distincte.out", "w", stdout);
    citire();
    solve();
    return 0;
}