Cod sursa(job #37790)

Utilizator wefgefAndrei Grigorean wefgef Data 25 martie 2007 12:34:48
Problema Distincte Scor 100
Compilator cpp Status done
Runda preONI 2007, Runda 4, Clasele 11-12 Marime 1.97 kb
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

#define str pair< int, pair<int, int> >
#define x first
#define y second.first
#define z second.second

#define Nmax 100005
#define mod 666013

int n, m, k;
int val[Nmax];
int rez[Nmax];
int ant[Nmax];
int seg[5*Nmax];
str q[Nmax];

void readdata()
{
     freopen("distincte.in", "r", stdin);
     freopen("distincte.out", "w", stdout);
     
     int i;
     
     scanf("%d %d %d", &n, &k, &m);
     for (i = 1; i <= n; ++i)
         scanf("%d", &val[i]);
     for (i = 1; i <= m; ++i)
     {
         scanf("%d %d", &q[i].y, &q[i].x);
         q[i].z = i;
     }
}

void update(int poz, int st, int dr, int a, int b, int val)
{
     if (a <= st && dr <= b)
     {
           seg[poz] += val;
           if (seg[poz] >= mod) seg[poz] -= mod;
           if (seg[poz] < 0) seg[poz] += mod;
           return;
     }
     int m = (st+dr)/2;
     
     if (a <= m) update(poz*2, st, m, a, b, val);
     if (b > m) update(poz*2+1, m+1, dr, a, b, val);
}

int query(int poz, int st, int dr, int a)
{
    int s = 0, m = (st+dr)/2;
    
    s = seg[poz];
    
    if (st == dr) return s;
    
    if (a <= m) s += query(poz*2, st, m, a);
    else s += query(poz*2+1, m+1, dr, a);
    
    if (s >= mod) s -= mod;
    
    return s;
}

void solve()
{
     int i, j;
     int s;
     
     sort(q+1, q+m+1);
     
     j = 1;
     for (i = 1; i <= n; ++i)
     {
         s = val[i];
         
         if (ant[s]) update(1, 1, n, 1, ant[s], -s);
         update(1, 1, n, 1, i, s);
         
         while (j <= m && q[j].x == i)
         {
               rez[ q[j].z ] = query(1, 1, n, q[j].y);
               ++j;
         }

         ant[s] = i;
     }
}

void writedata()
{
     int i;
     
     for (i = 1; i <= m; ++i)
         printf("%d\n", rez[i]);
}

int main()
{
    readdata();
    solve();
    writedata();
    return 0;
}